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

cli*_*ith 6 qt boost mingw cmake undefined-reference

我有一个用MinGW构建的静态库,我试图从Qt应用程序链接到该库.我不断收到由库中的一个目标文件引起的链接器错误.这个文件实际上声明了几个Boost头文件,一个用于使用shared_ptr,另一个用于使我可以使类不可复制.我相信使用这个提升功能是导致问题的原因,但我不知道为什么.如果我在Qt应用程序中注释掉使用文件中定义的类的类,那么Qt应用程序链接正常.这是输出的错误部分:

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x10a):未定义引用`__gxx_personality_sj0'

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x12f):未定义引用`_Unwind_SjLj_Register'

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x203):未定义引用`_Unwind_SjLj_Resume'

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x20e):未定义引用`_Unwind_SjLj_Unregister'

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x226):未定义引用`__gxx_personality_sj0'

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x24b):未定义引用`_Unwind_SjLj_Register'

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x31f):未定义引用`_Unwind_SjLj_Resume'

C:\ blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(.text + 0x32a):未定义引用`_Unwind_SjLj_Unregister'

C:\等等\建立\ WINDOWS\MinGW的\ libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp :(文字$ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [升压::详细:: SHARED_COUNT :: SHARED_COUNT(富:: 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_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_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_SomeClassImpl*)] + 0x106):未定义引用`_Unwind_SjLj_Unregister'colle2:ld返回1退出状态

另外要提一下的是我在这个类中使用指向实现的指针.任何帮助将非常感激.

解决了:我发现在我的MinGW提供的GCC版本之前,我的路径中有一个旧版本的GCC.旧版本包含在GNUStep包中,我曾经有过一段时间.我认为这些不同版本的配置导致了问题.感谢kemiisto,他正在解决问题的正确方向.

Wil*_*cat 3

看来您的静态库已链接到一个 MinGW 发行版(即第 3 版),但您尝试使用其他 MinGW 发行版(即与二进制 Qt 一起发行的第 4 版)将您的应用程序与该库链接。您应该使用与应用程序开发相同的 MinGW 来重建您的库。

更新

可能这是另一个众所周知的问题。看看这个话题。您可能有 2 个不同的包含 Qt 库的文件夹

C:\Qt\2009.05\bin;C:\Qt\2009.05\qt\bin 
Run Code Online (Sandbox Code Playgroud)

也在你的道路上。第一个文件夹 (...\bin) 中的库是使用 VS2008 编译的,第二个文件夹 (...\qt\bin) 中的库是使用 MinGW 编译的。当应用程序启动时,将查找路径变量中的项目。突然,路径变量中包含“错误”库的文件夹出现在包含正确项目的文件夹之前。您可以做的是复制 QtCore4.dll、QtGui4.dll 和其他需要与应用程序可执行文件放在文件夹中的库。希望这可以帮助。

关于这个问题的一些链接: