我有一个用MinGW构建的静态库,我试图从Qt应用程序链接到该库。我不断收到由库中的一个目标文件引起的链接器错误。这个文件实际上声明了几个Boost头文件,一个用于使用shared_ptr,另一个用于使我可以使类不可复制。我相信使用这个提升功能是导致问题的原因,但我不知道为什么。如果我在Qt应用程序中注释掉使用文件中定义的类的类,那么Qt应用程序链接正常。这是输出的错误部分:
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x10a): 未定义的引用 `__gxx_personality_sj0'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x12f): 未定义的引用 `_Unwind_SjLj_Register'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x203): 未定义的引用 `_Unwind_SjLj_Resume'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x20e): 未定义的引用 `_Unwind_SjLj_Unregister'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x226): 未定义的引用 `__gxx_personality_sj0'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x24b): 未定义的引用 `_Unwind_SjLj_Register'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x31f): 未定义的引用 `_Unwind_SjLj_Resume'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本+ 0x32a): 未定义的引用 `_Unwind_SjLj_Unregister'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本$ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [升压::详细:: SHARED_COUNT :: SHARED_COUNT(FOO :: foo_SomeClassImpl。 *)] +位于0xC): 未定义的引用 `__gxx_personality_sj0'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本$ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [升压::详细:: SHARED_COUNT :: SHARED_COUNT(FOO :: foo_SomeClassImpl。 *)] + 0X31): 未定义的引用 `_Unwind_SjLj_Register'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本$ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [升压::详细:: SHARED_COUNT :: SHARED_COUNT(FOO :: foo_SomeClassImpl。 *)] + 0xFB的才能): 未定义的引用 `_Unwind_SjLj_Resume'
C:\等等\建立\ Windows \ MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文本$ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [升压::详细:: SHARED_COUNT :: SHARED_COUNT(FOO :: foo_SomeClassImpl。 *)] + 0x106): 未定义的引用 `_Unwind_SjLj_Unregister'collect2:ld 返回1退出状态
另外要提到的是我在这个类中使用指向实现的指针。 任何帮助将不胜感激。
解决: 我发现在我的MinGW提供的GCC版本之前,我的路径中有一个旧版本的GCC。旧版本包含在GNUStep包中,我曾经有过一段时间。我认为这些不同版本的配置导致了问题。感谢kemiisto,他正在解决这个问题。
答案 0 :(得分:3)
您的静态库似乎与一个MinGW发行版(即第3版)相关联,但您尝试使用其他MinGW发行版(即使用二进制Qt分发的第4版)将您的应用程序与此库链接。您应该使用用于应用程序开发的相同MinGW重建库。
<强>更新强>
可能是另一个众所周知的问题。看看this topic。您可能有2个不同的Qt库文件夹
C:\Qt\2009.05\bin;C:\Qt\2009.05\qt\bin
也在你的道路上。使用VS2008编译的第一个文件夹(... \ bin)中的库和使用MinGW编译的第二个文件夹(... \ qt \ bin)中的库。应用程序启动时会查找path变量中的项目。突然,具有“错误”库的文件夹存在于路径变量中具有正确项目的文件夹之前。你可以做的是将QtCore4.dll,QtGui4.dll和你需要的其他库复制到你的应用程序可执行文件夹。希望这会有所帮助。
有关此问题的一些链接:
答案 1 :(得分:2)
以防其他人遇到此问题:我的项目重建使用了之前版本中的.o
个文件。我改变了两者之间的编译器。
事实证明,当我重建同一个项目时,新编译器没有构建新的.o
文件,因此他们缺少一些关键信息。删除旧文件并重建后,错误已修复。
我假设从头开始重建,没有删除,也会有同样的效果。
答案 2 :(得分:0)
您可能使用gcc
代替g++
。 gcc是一个C编译器。但是g ++是一个c ++编译器。
如果你有.cpp文件,请确保使用g ++。