2012-05-02 77 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