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

最佳答案

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

它确实存在标准的普通C ABI,因此如果liba仅包含普通C符号,则可以通过MinGw链接它们。

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

您应该尝试自己制作图书馆。
首先,安装msys,打开msys shell,转到项目文件夹,然后尝试

./configure && make

10-04 10:14