尝试将Qt app与我的静态库链接时未定义的引用

时间:2010-02-03 04:21:58

标签: qt boost mingw cmake undefined-reference

我有一个用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,他正在解决这个问题。

3 个答案:

答案 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 ++。