gpt4 book ai didi

c++ - g++ 的 liblastfm 编译错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:12 25 4
gpt4 key购买 nike

当我尝试编译我的代码时收到此编译错误:

/tmp/cc5InCzw.o: In function `Audiophile::lastfm_session()':
/media/Storage/Source Files/Audiophile/Scrobbling.cc:25: undefined reference to `LASTFM_init(char const*, char const*)'
/media/Storage/Source Files/Audiophile/Scrobbling.cc:27: undefined reference to `LASTFM_login(void*, char const*, char const*)'
/media/Storage/Source Files/Audiophile/Scrobbling.cc:48: undefined reference to `LASTFM_status(void*, char const**, int const**, char const**)'
/media/Storage/Source Files/Audiophile/Scrobbling.cc:51: undefined reference to `LASTFM_track_scrobble(void*, char*, char*, char*, long, unsigned int, unsigned int, unsigned int, _List**)'
/media/Storage/Source Files/Audiophile/Scrobbling.cc:54: undefined reference to `LASTFM_dinit(void*)'
collect2: error: ld returned 1 exit status

我一直在尝试使用 C 库编译我为 Linux 制作的音频程序 liblastfm .这是保存我的 scrobbling 函数的文件的代码。用户名、密码和 API key 更改为 Xs。

#include "Audiophile.h"                                                            
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "clastfm.h"

void Audiophile::lastfm_session()
{

scrobbling = true;

void LASTFM_SESSION *s;

// LASTFM_ALBUM_INFO *album;

// LASTFM_ARTIST_INFO *artist;

// LFMList *list = NULL,*i;


const char *status = NULL;

s = LASTFM_init("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXX");

int rv = LASTFM_login(s,"XXXXXXXXXXXXX","XXXXXXXXXXXXXXXXXX");

if(rv != 0)
{
cout << "\n\nAn error occurred when logining in!\n\n";
}

unsigned int length = ((position_field / 6000000000) / 10000000000);

char* title = const_cast<char*>((playing_track.title()).c_str());

char* album = const_cast<char*>((playing_track.album()).c_str());

char* artist = const_cast<char*>((playing_track.artist()).c_str());

time_t start_time;

time(&start_time);

cout << "\n\nstart time: " << start_time << "\n\n";

LASTFM_status(s,&status,NULL,NULL);

LASTFM_track_scrobble(s, artist, album, title, start_time, length,
0, 0, NULL);


LASTFM_dinit(s);

scrobbling = false;

}

我在编译语句中包含 -lclastfm。是这样的:

g++ -g -Wall main.cc Audiophile_GTK3.cc Menu_GTK3.cc Playlist_GTK3.cc Configuration_GTK3.cc Configuration.cc Audiophile.cc Metadata.cc Scrobbling.cc -std=c++0x -o audiophile `pkg-config --cflags --libs gtkmm-3.0` $(pkg-config --cflags --libs gstreamer-1.0) $(pkg-config --libs --cflags taglib) -lclastfm -lconfig++ -lboost_system -lboost_filesystem

我正在使用 Arch。我检查了/usr/include 并且 clastfm.h 在那里。我什至尝试将 clastfm.h 添加到我的程序的主目录中。那也没用。我在我的代码中广泛使用 GStreamer 1.24,它是纯 C 代码。除了必须澄清一些枚举之外,它与 g++ 完美配合。与枚举相关的问题可能是这些编译错误发生的原因吗?

如果有帮助,我会在更新后提供我的代码的 github。不知道如何进行版本编号是它(尚未)更新的唯一原因。

最佳答案

这些不是编译器错误;你的 C 代码编译得很好。这些是链接器错误,表明您的程序未成功链接到 liblastfm

我假设您链接的是您下载的 liblastfm 二进制文件,而不是您正在构建的东西。问题是这个库是一个“C”ABI 库,而您正在使用 g++ 编译您的应用程序。这意味着所有符号都将是 mangled .

真正的问题是clastfm.h 头文件需要用extern "C" 包装其内容。这告诉 g++ 不要为这些函数生成带有错位名称的外部符号引用,而是使用普通的旧 C 风格(非错位)命名。

您可以尝试像这样修改您的代码:

extern "C" {
#include "clastfm.h"
}

关于c++ - g++ 的 liblastfm 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24053318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com