c++ - 在 C++ 应用程序中使用 id3lib 库时出现 undefined reference 链接器错误

标签 c++ windows qt id3lib

我的操作系统是 Windows 7 Ultimate x64。我正在使用 Qt 4.8 编写一个将使用 id3lib 的程序。我已经下载了 windows binaries .以下是显示如何使用 id3lib 库的 *.pro 文件的一部分:

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 目录中,所有必需的 header 均位于 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')

我知道是什么原因导致 undefined reference ,但在我的例子中,为什么链接器找不到实现?它现在在 id3lib.dll 中了吗?有谁知道是否有任何解决方法?

最佳答案

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

确实存在标准纯C ABI,因此您可以链接到liba通过 MinGw , 如果它们只包含 plain C 符号。

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

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

./configure && make

关于c++ - 在 C++ 应用程序中使用 id3lib 库时出现 undefined reference 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786022/

相关文章:

c++ - 如何在重命名函数(c++)中使用变量?

Python,Colorama,将颜色代码分配给变量

c++ - 执行 C++ 程序并使用 Perl 复制 cmd 输出

windows性能记录器记录具体过程

c++ - 自动检测模板函数的返回类型

c++ - Dlib 错误 : error C1083: Cannot open include file :'type_safe_union/type_safe_union_kernel.h'

c++ - 指向 char 的指针与字符串

c++ - EnhTableWidget 字段的值更改(返回前)时发出信号

c++ - Qt - 如何将 QProcess 的标准输出重定向到 TextEdit

c - 使用 FTD2XX C++ 的 QtCreator undefined reference