2012-05-02 53 views
7

我想使用JsonCpp库。我在Windows上使用MinGW和CodeBlocks。未定义的引用_unwind_resume和__gxx_personality_v0

当我从json头文件中包含任何东西时,我的链接器崩溃并且发出了这两个错误。我开始环顾四周,我发现它基本上描述了我的问题,这两个其他问题:

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

What is __gxx_personality_v0 for?

如果我宣布了两名失踪变量空指针,像下面的问题消失:

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

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

我还在同一个文件中包含了一个boost库,它不会引起任何问题。

编辑:

错误输出正是我在标题说:我得到的链接中,共向_Unwind_Resume和__gxx_personality_v0 22点未定义的引用。我的代码是:

#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 

SECOND编辑: 我加入我使用编译库中的命令行:

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 
+0

请澄清你的问题。它可能有助于显示实际的错误输出。 – Jerry

+0

你有编译器输出吗?什么是编译器和链接器命令行? – jpalecek

+3

你是用'gcc'还是'g ++'链接?请注意,当抛出异常时,您的修复将导致null解引用和运行时的令人讨厌的崩溃。 – rubenvb

回答

0

我最后由导入到该固定Code ::阻止JsonCpp的源代码并自己创建库。至于为什么使用Scons创建的库不工作,我仍然困惑不解,因为它使用的是与Code :: Blocks使用的相同的编译器,但同时它不是(或者错误不会存在)。

24

对于那些来这从谷歌(如我一样),以_Unwind_Resume__gxx_personality_v0的未定义的引用的真正原因是“利用使用不同的堆栈展开方法比DWARF2一个gcc” [1]

在我的情况下,它试图将使用GCC 4.9编译的代码与使用GCC 4.8或更低版本编译的库链接。解决方案是用你正在编译的相同编译器重新编译库。

+1

很好的答案。我在使用gcc 4时尝试恢复到gcc 3时遇到了'__Unwind_Resume'错误。我必须返回并使用gcc 3重新编译两个库,然后才能链接它们。 – tomlogic