Undefined reference to _Unwind_Resume和__gxx_personality_v0的含义是什么?

15

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

当我包含json头文件中的任何内容时,我的链接器会崩溃并输出这两个错误。我开始四处寻找,并找到了这两个其他问题,基本上描述了我的问题:

g ++问题和“未定义的引用`__gxx_personality_v0'”

__gxx_personality_v0是什么?

如果我将两个缺少的变量声明为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

请澄清您的问题。展示实际的错误输出可能会有所帮助。 - Jerry
你有编译器的输出吗?编译器和链接器的命令行是什么? - jpalecek
3
你是使用gcc还是g++进行链接?请注意,你的修复方案会在运行时抛出异常时导致空指针引用和令人讨厌的崩溃。 - rubenvb
@jpalecek 我已经添加了命令行输出,希望能对你有所帮助 - 一些参数(hge,sfml)是无用的,但这是因为我将它们放在我的通用配置中,以避免在每个项目中链接它们。 - Svalorzen
1
请查看我对相关问题的回答。这种问题通常是由于编译器与编译库使用的编译器之间存在库/ABI不匹配引起的。 - Mankarse
显示剩余2条评论
3个回答

44

如果您从谷歌(像我一样)来到这里,请注意,造成对_Unwind_Resume__gxx_personality_v0的未定义引用的真正原因是“使用了与dwarf2不同的堆栈展开方法的gcc” [1]

在我的情况下,我试图链接使用GCC 4.9及以上编译的代码和使用GCC 4.8或更低版本编译的库。解决方案是使用与您正在构建的编译器相同的编译器重新编译库。


2
好的回答。当我尝试从gcc 4回退到gcc 3时,遇到了__Unwind_Resume错误。在链接它们之前,我不得不返回并使用gcc 3重新编译两个库。 - tomlogic

1

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接