qt - 尝试将Qt应用程序与我的静态库链接时存在 undefined reference

标签 qt boost mingw cmake undefined-reference

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

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x10a): undefined reference to `__gxx_personality_sj0'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x12f): undefined reference to `_Unwind_SjLj_Register'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x203): undefined reference to `_Unwind_SjLj_Resume'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x20e): undefined reference to `_Unwind_SjLj_Unregister'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x226): undefined reference to `__gxx_personality_sj0'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x24b): undefined reference to `_Unwind_SjLj_Register'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x31f): undefined reference to `_Unwind_SjLj_Resume'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text+0x32a): undefined reference to `_Unwind_SjLj_Unregister'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)]+0xc): undefined reference to `__gxx_personality_sj0'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)]+0x31): undefined reference to `_Unwind_SjLj_Register'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)]+0xfb): undefined reference to `_Unwind_SjLj_Resume'

C:\blah\build\windows\mingw\libfoo.a(foo_ctis.cpp.obj):foo_ctis.cpp:(.text$_ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_[boost::detail::shared_count::shared_count(foo::foo_SomeClassImpl*)]+0x106): undefined reference to `_Unwind_SjLj_Unregister' collect2: ld returned 1 exit status



要提及的另一件事是,我在此类中使用了一个指向实现的指针。
任何帮助将非常感激。

解决了:
我发现我的路径中有一个较旧的GCC版本,而在我的MinGW提供GCC版本之前,该版本已包含在内。我曾经有过的旧版本包含在GNUStep软件包中。我认为这些不同版本的配置引起了问题。感谢kemiisto,他在解决问题上走上了正确的道路。

最佳答案

看来您的静态库是与一个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和其他需要与应用程序可执行文件一起文件夹的库。希望这可以帮助。

有关此问题的一些链接:
  • @qtforum.org
  • @some blog post (in Russian =))
  • 关于qt - 尝试将Qt应用程序与我的静态库链接时存在 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2189681/

    相关文章:

    c++ - Boost::ptr_vector 改变元素顺序

    module - Mingw - kernel32.mod - 没有这样的文件或目录

    c++ - Qt ActiveX QAxObject 格式 Excel 单元格注释

    c++ - 我如何在我的 C++ 代码中创建 QML Canvas 并在其上附加视频?比如 Java Canvas 我可以

    visual-studio-2010 - 使用boost库的dll版本

    multithreading - 我可以使用 Boost 消息队列进行线程通信吗

    cygwin - Windows-7 上的 Linux 开发 C/C++/bash/python

    c++ - 串口通信教程

    c++ - 使用 QPushButton C++ 打开一个窗口

    c++ - QMetaObject::connectSlotsByName:没有匹配的信号