Qt / mingw32未定义的引用错误...无法链接.lib

时间:2009-07-16 12:45:20

标签: c++ qt linker mingw

我是Qt的新手,有一个我无法解决的错误。

我有一堆windows(VS2005)静态库文件(.lib)。我正在测试它们是否与Qt配合良好。所以我选择了最简单的库。 (称为MessageBuffer)。

所以我将MessageBuffer.h添加到main.cpp,并在INCLUDEPATH的{​​{1}}中添加了这些文件的位置。

在此之前一切似乎都很好,我可以使用该类和Qt IDE显示所有方法和所有内容。所以对我来说,它看起来像找到了.h文件。

现在我在.pro中添加了MessageBuffer.lib(VS2005 / Debug版本),如下所示:

.pro

我也尝试了以下内容:

LIBS += E:/SharedLibrary/lib/MessageBufferd.lib

以下是我的win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib LIBS += -LE:/SharedLibrary/lib -lMessageBufferd win32:LIBS += -LE:/SharedLibrary/lib -lMessageBufferd 文件的内容:

.pro

他们都给了我同样的错误:(即使我不包括QT += opengl TARGET = SilverEye TEMPLATE = app INCLUDEPATH += E:/SharedLibrary/MessageBuffer SOURCES += main.cpp \ silvereye.cpp HEADERS += silvereye.h FORMS += silvereye.ui OTHER_FILES += win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib ,我也会得到同样的错误)

.lib

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

根据问题Use libraries compiled with visual studio in an application compiled by g++ (mingw)和MSDN论坛帖子I can't mix VC & GCC,您似乎无法将gcc应用程序与visual c ++编译库链接。

解决方案是使用相同的编译器重新编译所有内容。

答案 1 :(得分:4)

MinGW FAQ讨论了这个问题并提供了解决方案:

  1. 使用reimp(用于lib文件)或pexports(用于dll文件)创建定义文件。
  2. 从stdcall函数中删除下划线前缀。
  3. 使用dlltool将MSVC库转换为具有新定义的MinGW库。
  4. 那不起作用。我们最终从函数名中删除了序数,这导致它编译。但程序无法运行,因为它无法在DLL中找到链接的函数。最后,在查阅定义文件的MSDN文档后,我们更改了构建指令:

    1. 使用reimp创建定义文件。
    2. 对于每个stdcall函数(格式为_name @ ordinal),添加一个行名= _name @ ordinal,允许MinGW将其stdcall命名约定映射到MSVC的命名约定。
    3. 使用dlltool将MSVC库转换为具有新定义的MinGW库。
    4. 有效!要编译项目,您必须简单地:

      1. 下载并安装Qt / Windows软件包,其中包括MinGW。
      2. 下载reimp并将其放入MinGW / bin文件夹。
      3. 下载第三方库的开发包,并将环境变量指向该位置。
      4. 使用通常的qmake / make命令构建项目。
      5. 取自: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/

答案 2 :(得分:0)

我假设您在另一个有问题的应用程序中使用了MessageBuffer库。该错误看起来无法找到库或者没有导出MessageBuffer类。

您是否尝试在专业文件中将-l放在库的前面?

win32:LIBS += -lE:/SharedLibrary/lib/MessageBufferd.lib

查看我的其他answer。我添加了另一个答案,因为我不想让这个答案比现在更混乱。

到目前为止尝试过:

  • 不是拼写错误,d附加到库
  • 使用lib扩展名是正确的,如输出
  • 中所示