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

11

我刚接触Qt,但有一个错误无法解决。

我有一堆Windows(VS2005)的静态库文件(.lib),现在想测试它们是否能与Qt很好地配合使用。因此,我选择了我拥有的最简单的库(称为MessageBuffer)。

于是我把MessageBuffer.h添加到main.cpp中,并将这些文件的位置添加到.proINCLUDEPATH中。

直到那时,一切似乎都很好,我可以使用类和Qt IDE显示所有方法等。所以对我来说,它看起来已经找到了.h文件。

现在我像这样在.pro中添加了MessageBuffer.lib(VS2005/Debug版本):

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 也是如此)

Running build steps for project SilverEye...
Configuration unchanged, skipping QMake step.
Starting: C:/Qt/2009.03/mingw/bin/mingw32-make.exe -w 
mingw32-make: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
C:/Qt/2009.03/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\SilverEye.exe debug/main.o debug/silvereye.o debug/moc_silvereye.o -L"c:\Qt\2009.03\qt\lib" -lopengl32 -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind E:/SharedLibrary/lib/MessageBufferd.lib -lQtOpenGLd4 -lQtGuid4 -lQtCored4
mingw32-make[1]: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
mingw32-make: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
debug/main.o: In function `Z5qMainiPPc':
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:12: undefined reference to `MessageBuffer::MessageBuffer()'
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:13: undefined reference to `MessageBuffer::Append(char*, int)'
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()'
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\SilverEye.exe] Error 1
mingw32-make: *** [debug] Error 2
Exited with code 2.
Error while building project SilverEye
When executing build step 'Make'

有人可以帮忙吗?


你能发布一下你正在使用的 pro 文件吗? - Jesse Vogt
刚刚在原始消息中添加了pro文件内容。 - xcimo
3个回答

5

这实际上是我要发布的内容,我发现了这个:这些库,就像许多其他预编译的Windows开发包(如MySQL客户端库)一样,是使用Ms Visual C++(MSVC)编译的。我们发现,MSVC和MinGW使用不同的命名约定来处理stdcall函数。 MSVC将它们导出为_name@ordinal,但MinGW将它们导出为name。因此,当调用从MSVC库导出的stdcall函数时,MinGW构建会失败,并显示“未定义的引用”链接错误。 - xcimo
请查看以下链接以获取解决方案: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/ - xcimo

4
MinGW的常见问题解答(FAQ)中提到了这个问题,并提供了解决方案:
  1. 使用reimp(对于lib文件)或pexports(对于dll文件)创建一个定义文件。
  2. 从stdcall函数中删除下划线前缀。
  3. 使用dlltool将MSVC库转换为具有新定义的MinGW库。
但那没用。最后,我们从函数名称中移除了序数,这样就可以编译了。但程序无法运行,因为它无法在DLL中找到链接的函数。最后,在查阅MSDN文档上的定义文件后,我们更改了构建说明:
  1. 使用reimp创建一个定义文件。
  2. 对于每个stdcall函数(格式为_name@ordinal),添加一行name = _name@ordinal,使MinGW能够将其stdcall命名约定映射到MSVC的命名约定。
  3. 使用dlltool将MSVC库转换为具有新定义的MinGW库。
这次成功了!要编译项目,您只需执行以下操作:
  1. 下载并安装包含MinGW的Qt / Windows软件包。
  2. 下载reimp并将其放入MinGW / bin文件夹中。
  3. 下载第三方库的开发包,并将环境变量指向该位置。
  4. 使用通常的qmake / make命令构建项目。
参考自:http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/

我目前正在尝试使用QT的Visual Studio插件,以构建QT应用程序并使用VS编译器(以及使用我的MSVC .libs)。 - xcimo

0

我假设您在另一个应用程序中使用了MessageBuffer库并遇到了问题。错误看起来要么无法找到库,要么MessageBuffer类未被导出。

您是否尝试在pro文件中在库的前面加上-l呢?

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

请查看我的其他答案。我添加了另一个答案,因为我不想让这个答案变得更加混乱。

到目前为止尝试过:

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

d是实际名称,d是添加到.lib的调试版本中的。 - xcimo
@xcimo 有道理...只是想确认一下。 - Jesse Vogt
说实话,我不确定是否需要这样做...但错误似乎暗示它们找不到。 - Jesse Vogt
你认为它找不到 .h 文件还是 .lib 文件? - xcimo
如果你还没有尝试过,可以在pro文件中的库前面加上-l。 - Jesse Vogt
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接