【问题标题】:Undefined reference linker error while using id3lib library in a C++ application在 C++ 应用程序中使用 id3lib 库时出现未定义的引用链接器错误
【发布时间】:2012-03-20 11:37:18
【问题描述】:

我的操作系统是 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 中吗?有谁知道有什么解决方法吗?

【问题讨论】:

  • @Lol4t0:是的。我正在使用 Qt Creator。

标签: c++ windows qt id3lib


【解决方案1】:

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

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

但在您的情况下并非如此(因为存在ID3_CPP_EXPORT这样的定义)。

你应该尝试自己制作图书馆。 首先,安装msys,打开msys shell,进入项目文件夹并尝试

./configure && make

【讨论】:

  • 在您的回答中您提到了 ABI。什么是 ABI?
  • @Donotalo,总的来说,它是一种低于标准的协议。您可以看到 herethere 它所描述的内容。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2014-06-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多