Ошибка компиляции liblastfm с g ++

Я получаю эту ошибку компиляции, когда я пытаюсь скомпилировать мой код:

/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

Я пытался скомпилировать аудио программу, которую я делал для Linux, с библиотекой C liblastfm. Вот код для файла, который содержит мою функцию для скробблинга. Имя пользователя, пароль и ключи API изменены на 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 для своего кода, как только обновлю его, если это поможет. Не знать, как сделать нумерацию версий, единственная причина, по которой она не обновляется (пока).

2

Решение

Это не ошибки компилятора; ваш код на C компилируется просто отлично. Это ошибки компоновщика, что указывает на то, что ваша программа не была успешно связана с liblastfm,

Я предполагаю, что вы ссылаетесь против liblastfm двоичные файлы что вы скачали, а не то, что вы строите. Проблема в том, что эта библиотека является библиотекой ABI «C», и вы компилируете свое приложение с помощью g ++. Это означает, что все символы будут искромсанный.

реальный проблема в том, что clastfm.h заголовочный файл должен иметь extern "C" упаковка его содержимого. Это говорит g ++ не генерировать внешние ссылки на символы с искаженными именами для этих функций, а вместо этого использовать обычное именование в стиле C (не искаженное).

Вы можете попробовать изменить ваш код следующим образом:

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

Другие решения


По вопросам рекламы [email protected]