Ошибка неопределенного ссылочного компоновщика при использовании библиотеки id3lib в приложении C++
Моя ОС - Windows 7 Ultimate x64. Я использую Qt 4.8 для написания программы, которая будет использовать id3lib. Я скачал двоичные файлы Windows. Вот часть файла *.pro, показывающая, как используется библиотека id3lib:
HEADERS += MainWindow.h \
id3lib/id3/sized_types.h \
id3lib/id3/globals.h \
id3lib/id3/tag.h \
id3lib/id3/utils.h \
id3lib/id3/id3lib_frame.h \
id3lib/id3/field.h \
id3lib/id3/id3lib_strings.h \
id3lib/id3/id3lib_streams.h
win32: LIBS += -L$$PWD/id3lib/ -lid3lib
INCLUDEPATH += $$PWD/id3lib
DEPENDPATH += $$PWD/id3lib
Как вы можете догадаться, библиотечные файлы (id3lib.dll и id3lib.lib) находятся в id3lib
каталог и все необходимые заголовки находятся в id3lib/id3
каталог.
В globals.h я определил следующее:
#define ID3LIB_LINKOPTION LINKOPTION_CREATE_DYNAMIC
И изменил следующий раздел в том же файле:
# if (ID3LIB_LINKOPTION == LINKOPTION_CREATE_DYNAMIC)
//used for creating a dynamic dll
# define ID3_C_EXPORT extern _declspec(dllexport)
# define ID3_CPP_EXPORT __declspec(dllexport)
# define CCONV __stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
# endif
следующее:
# if (ID3LIB_LINKOPTION == LINKOPTION_CREATE_DYNAMIC)
//used for creating a dynamic dll
# define ID3_C_EXPORT Q_DECL_IMPORT
# define ID3_CPP_EXPORT Q_DECL_IMPORT
# define CCONV __stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
# endif
так что это работает с Qt.
Далее я включил id3/tag.h
и написал следующий код:
ID3_Tag tag("test.wma");
qDebug() << tag.size();
После компиляции я получил следующие ошибки:
undefined reference to `_imp___ZN7ID3_TagC1EPKc'
undefined reference to `_imp___ZNK7ID3_Tag4SizeEv'
undefined reference to `_imp___ZN7ID3_TagD1Ev'
undefined reference to `_imp___ZN7ID3_TagD1Ev'
(several few, same format: `_imp___xxxxx_Tagxxxx')
Я знаю, что вызывает неопределенную ссылку, но в моем случае, почему компоновщик не может найти реализацию? Это сейчас там в id3lib.dll? Кто-нибудь знает, есть ли обходной путь?
2 ответа
Проблема не в цепях инструментов, а в ABI.
Он существует в стандартном простом C ABI, поэтому вы можете lib
а такжеa
от MinGw
, если они содержат только простые символы C.
Но это не так в вашем случае (так как такие определяют как ID3_CPP_EXPORT
существовать).
Вы должны попытаться сделать библиотеку youserlf. Для начала установите msys
, откройте оболочку msys, перейдите в папку проекта и попробуйте
./configure && make
Поскольку вы не используете Visual Studio, которая поддерживает файлы.lib, чтобы связать ваш проект с нужной DLL, вам нужен id3lib.a (или что-то подобное). Цепочка инструментов GNU отличается от MS, поэтому вам нужны правильные файлы статических ссылок. Мой совет - скомпилировать библиотеку самостоятельно на вашем компиляторе, так как она с открытым исходным кодом, это стоит делать.