【问题标题】:Undefined references when trying to link Qt app with my static library尝试将 Qt 应用程序与我的静态库链接时未定义的引用
【发布时间】:2011-01-12 11:29:41
【问题描述】:

我有一个使用 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:\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): 未定义的引用 `__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): 未定义的引用 `_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): 未定义的引用 `_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): 未定义的引用 `_Unwind_SjLj_Unregister' collect2: ld 返回 1 个退出状态

另外一件事是我在这个类中使用了一个指向实现的指针。 任何帮助将不胜感激。

已解决: 我发现在我的 MinGW 提供 GCC 版本之前,我的路径中有一个旧版本的 GCC。旧版本包含在我不久前的一个 GNUStep 包中。我认为这些不同版本的配置导致了问题。感谢 kemiisto,他在解决问题方面走在了正确的轨道上。

【问题讨论】:

    标签: qt boost mingw cmake undefined-reference


    【解决方案1】:

    您可能使用了gcc 而不是g++。 gcc 是一个 C 编译器。但是 g++ 是一个 c++ 编译器。

    如果您有 .cpp 文件,请确保使用 g++。

    【讨论】:

      【解决方案2】:

      以防万一其他人遇到此问题:我的项目重建使用的是以前构建的 .o 文件。我在两者之间更改了编译器。

      事实证明,当我重建同一个项目时,新编译器没有构建新的 .o 文件,因此它们缺少一些关键信息。删除旧文件并重建后,错误已修复。

      我假设从头开始重建,没有删除,将工作相同。

      【讨论】:

        【解决方案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) 中的库。应用程序启动时会查找路径变量中的项目。突然,在路径变量中具有正确项目的文件夹之前存在具有“错误”库的文件夹。您可以做的是复制 QtCore4.dll、QtGui4.dll 和您需要与应用程序可执行文件一起文件夹的其他库。希望这会有所帮助。

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

        【讨论】:

        • 您好 kemiisto,感谢您的回复。我相信我使用的是相同版本的 MinGW。我正在使用 CMake 构建不同类型的 makefile。我尝试为 MinGW 构建 makefile,但遇到错误,因此我在命令提示符路径中包含 C:\Qt\2009.05\mingw\bin。在这个 CMake 能够生成 MinGW makefile 之后,我能够使用 mingw32-make 来构建静态库。那不是使用相同的版本吗?我想我的电脑上没有其他版本。
        • @csmithmaui:在那种情况下,我还有一个想法。我在消息中添加了一些信息。
        • 我分析了我的路径,实际上我没有您在上面发布的任何一个。我只有 C:\Qt\2009.05\mingw\bin。在包含我刚刚提到的 MinGW 路径后,我的静态库在命令提示符下构建良好。问题是当我尝试从 QtCreator 链接到我的库时,出现链接器错误。我阅读了您发布的链接,但我认为这不是我的问题。此外,如果我删除了对相关文件中包含的类的任何引用,则其他所有内容都可以正常链接。非常感谢您的帮助。
        • 想让您知道您在解决我上周遇到的问题方面走在了正确的轨道上。事实证明,GNUStep 被包含在我的路径中,并且它包含的 GCC 被用于构建我的库,这反过来又与使用 MinGW GCC 的 Qt 应用程序不兼容。谢谢。
        猜你喜欢
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        • 2020-12-16
        相关资源
        最近更新 更多