我的操作系统是Windows 7旗舰版x64。我正在使用Qt 4.8编写一个将使用id3lib的程序。我已经下载了windows binaries。以下是* .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中吗?有没有人知道是否有任何解决方法?
答案 0 :(得分:1)
由于您没有使用支持.lib文件的Visual Studio将项目链接到正确的DLL,因此您需要id3lib.a(或类似的东西)。 GNU工具链与MS不同,因此您需要正确的静态链接文件。我的建议是在编译器上自己编译库,因为它是开源的,值得这样做。
答案 1 :(得分:1)
问题不在于工具链,而在于ABI。
存在标准普通C ABI,因此您可以lib
与a
链接MinGw
它们只包含 plain C 符号。
但在你的情况下却不是这样(因为这样的定义为ID3_CPP_EXPORT
)。
你应该尝试通过youserlf创建库。
首先,安装msys
,打开msys shell,转到项目文件夹并尝试
./configure && make