7

我有一个用 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,他在解决问题方面走在了正确的轨道上。

4

3 回答 3

3

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

更新

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

C:\Qt\2009.05\bin;C:\Qt\2009.05\qt\bin 

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

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

于 2010-02-03T11:36:16.217 回答
2

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

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

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

于 2012-11-08T05:54:06.113 回答
0

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

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

于 2014-08-09T23:02:40.550 回答