在C ++应用程序中使用id3lib库时未定义的引用链接器错误

我的操作系统是Windows 7旗舰版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吗? 有谁知道是否有任何解决方法?

Solutions Collecting From Web of "在C ++应用程序中使用id3lib库时未定义的引用链接器错误"

问题不在于工具链,而在于ABI。

确实存在标准的普通C ABI,所以如果它们只包含普通的C符号,你可以通过MinGw链接到liba

但是在你的情况下不是这样的(因为这样的定义存在ID3_CPP_EXPORT )。

你应该尽量让你的图书馆。 首先,安装msys ,打开msys shell,转到项目文件夹并尝试

 ./configure && make 

由于您没有使用支持.lib文件的Visual Studio来将您的项目链接到正确的DLL,因此您需要使用id3lib.a(或类似的东西)。 GNU工具链与MS不同,所以你需要正确的静态链接文件。 我的建议是编译你自己的库,因为它是开源的,这是值得的。