Я получаю эту ошибку компиляции, когда я пытаюсь скомпилировать мой код:
/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 для своего кода, как только обновлю его, если это поможет. Не знать, как сделать нумерацию версий, единственная причина, по которой она не обновляется (пока).
Это не ошибки компилятора; ваш код на C компилируется просто отлично. Это ошибки компоновщика, что указывает на то, что ваша программа не была успешно связана с liblastfm
,
Я предполагаю, что вы ссылаетесь против liblastfm
двоичные файлы что вы скачали, а не то, что вы строите. Проблема в том, что эта библиотека является библиотекой ABI «C», и вы компилируете свое приложение с помощью g ++. Это означает, что все символы будут искромсанный.
реальный проблема в том, что clastfm.h
заголовочный файл должен иметь extern "C"
упаковка его содержимого. Это говорит g ++ не генерировать внешние ссылки на символы с искаженными именами для этих функций, а вместо этого использовать обычное именование в стиле C (не искаженное).
Вы можете попробовать изменить ваш код следующим образом:
extern "C" {
#include "clastfm.h"}