【问题标题】:Undefined reference to _Unwind_Resume and __gxx_personality_v0对 _Unwind_Resume 和 __gxx_personality_v0 的未定义引用
【发布时间】:2012-05-12 06:49:53
【问题描述】:

我正在尝试使用 JsonCpp 库。我在 Windows 上,使用 MinGW 和 CodeBlocks。

当我从 json 标头中包含任何内容时,我的链接器会内爆并给出这两个错误。我开始环顾四周,发现另外两个问题基本上描述了我的问题:

problem with g++ and "undefined reference to `__gxx_personality_v0'"

What is __gxx_personality_v0 for?

如果我将两个缺失的变量声明为 void 指针,如下所示,问题就消失了:

void * __gxx_personality_v0=0;
void * _Unwind_Resume =0;

但是,我不明白为什么会发生此错误。 CodeBlocks 设置为使用 migw32-g++ 处理 cpp 文件,并且添加 -lstdc++ 选项也不能解决问题。选项 -fno-exception 也没有(我想要例外,请注意,我只是在尝试)。

我还在同一个文件中包含了一个 boost 库,这不会导致任何问题。

编辑:

错误输出正是我在标题中所说的:在链接过程中,我总共获得了 22 个对 _Unwind_Resume 和 __gxx_personality_v0 的未定义引用。我的代码是:

#include <boost/algorithm/string.hpp>
#include <include/json/value.h>
//void * __gxx_personality_v0=0;
//void * _Unwind_Resume =0;
int main () {
    std::string str1("Hello world!");
    boost::to_upper(str1);
    Json::Value k;
    return 0;
}

只有当我包含/使用 JsonCPP 库时才会出现错误。取消注释注释行可以解决问题。

命令行输出是这样的:

mingw32-g++.exe -Wall -fexceptions  -g  -DSFML_DYNAMIC   -IC:\Users\Svalorzen\Documents\Projects\boost_1_49 -IC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -IC:\Users\Svalorzen\Documents\Projects\SFML-1.6\include -IC:\Users\Svalorzen\Documents\Projects\hge181\include  -c C:\Users\Svalorzen\Documents\Projects\test\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -LC:\Users\Svalorzen\Documents\Projects\SFML-1.6\lib -LC:\Users\Svalorzen\Documents\Projects\hge181\lib  -o bin\Debug\test.exe obj\Debug\main.o   -fno-exceptions -lsfml-graphics -lsfml-window -lsfml-system  C:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0\libs\mingw\libjson_mingw_libmt.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhge.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhelp.a 
Output size is 1.22 MB
Process terminated with status 0 (0 minutes, 3 seconds)
0 errors, 0 warnings

第二次编辑: 我正在添加用于编译库的命令行:

g++ -o buildscons\mingw\src\lib_json\json_reader.o -c -DWIN32 -DNDEBUG -D_MT -Iinclude src\lib_json\json_reader.cpp
g++ -o buildscons\mingw\src\lib_json\json_value.o -c -DWIN32 -DNDEBUG -D_MT -Iinclude src\lib_json\json_value.cpp
g++ -o buildscons\mingw\src\lib_json\json_writer.o -c -DWIN32 -DNDEBUG -D_MT -Iinclude src\lib_json\json_writer.cpp
ar rc buildscons\mingw\src\lib_json\libjson_mingw_libmt.a buildscons\mingw\src\lib_json\json_reader.o buildscons\mingw\src\lib_json\json_value.o buildscons\mingw\src\lib_json\json_writer.o
ranlib buildscons\mingw\src\lib_json\libjson_mingw_libmt.a

【问题讨论】:

  • 请澄清您的问题。显示实际的错误输出可能会有所帮助。
  • 你有编译器输出吗?什么是编译器和链接器命令行?
  • 您链接的是gcc 还是g++?请注意,当抛出异常时,您的修复将导致 null 取消引用和运行时严重的崩溃。
  • @jpalecek 我已经添加了命令行输出,希望对您有所帮助 - 一些参数 ( hge, sfml ) 没用,但那是因为我已将它们放在我的常规配置中以避免将它们链接到我做的每个项目。
  • 查看我对this 相关问题的回答。此类问题通常是由于您的编译器与用于编译该库的编译器之间的库/ABI 不匹配造成的。

标签: c++ exception mingw


【解决方案1】:

对于那些从 google 来的人(就像我一样),未定义引用 _Unwind_Resume__gxx_personality_v0 的真正原因是“使用与 dwarf2 不同的堆栈展开方法的 gcc”[1 ]

在我的例子中,它试图将使用 GCC 4.9 向上编译的代码与使用 GCC 4.8 或更低版本编译的库链接起来。解决方案是使用您正在构建的相同编译器重新编译库。

【讨论】:

  • 好答案。我在使用 gcc 4 后尝试恢复到 gcc 3 时遇到了__Unwind_Resume 错误。我必须返回并使用 gcc 3 重新编译两个库,然后才能链接它们。
【解决方案2】:

我在尝试使用 g++ -g -std=c++17 ... 时遇到了同样的问题。我删除了该选项,一旦我删除了对 C++17 功能的使用,它就会编译、链接并运行。

【讨论】:

    【解决方案3】:

    我最终通过将 JsonCpp 的源代码导入 Code::Blocks 并自己创建库来解决此问题。我仍然对为什么用 Scons 创建的库不起作用感到困惑,因为它使用的编译器与 Code::Blocks 使用的编译器相同,但同时它不是(或者错误不会存在)。

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多