Ошибка неопределенного ссылочного компоновщика при использовании библиотеки id3lib в приложении C ++ - PullRequest
0 голосов
/ 20 марта 2012

Моя ОС - 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 ]

1 голос
/ 20 марта 2012

Проблема заключается не в цепочках инструментов, а в ABI.

Это существует стандарт обычный C ABI, так что вы можете связать как lib, так и a с помощью MinGw, если они содержат только обычный C символов.

Но в вашем случае это не так (поскольку такие определения, как ID3_CPP_EXPORT существуют).

Вы должны попытаться создать библиотеку youserlf. Для начала установите msys, откройте оболочку msys, перейдите в папку проекта и попробуйте

./configure && make
1 голос
/ 20 марта 2012

Поскольку вы не используете Visual Studio, которая поддерживает файлы .lib, чтобы связать ваш проект с нужной DLL, вам нужен id3lib.a (или что-то подобное). Цепочка инструментов GNU отличается от MS, поэтому вам нужны правильные файлы статических ссылок. Мой совет - скомпилировать библиотеку самостоятельно на вашем компиляторе, так как она с открытым исходным кодом, стоит делать это.

...