2012-05-02 17 views
7

Próbuję użyć biblioteki JsonCpp. Jestem w systemie Windows, używając MinGW i CodeBlocks.Niezdefiniowane odniesienie do _unwind_resume i __gxx_personality_v0

Po dodaniu czegokolwiek z nagłówków json, mój linker imploduje i podaje te dwa błędy. Zacząłem się rozglądać i znalazłem te dwa inne pytania, które w zasadzie opisać mój problem:

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

What is __gxx_personality_v0 for?

A jeśli Oświadczam dwóch brakujących zmiennych za nieważne wskazówek, jak poniżej, problem zniknie:

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

Jednak nie rozumiem, dlaczego ten błąd się zdarza. CodeBlocks jest skonfigurowany tak, aby używał migw32-g ++ dla plików cpp, a także dodanie opcji -lstdC++ nie rozwiązuje problemu. Nie ma również opcji -fno-wyjątek (chcę wyjątków, pamiętajcie, po prostu próbowałem).

Dołączam także bibliotekę boost w tym samym pliku i nie powoduje żadnych problemów.

EDIT:

Wyjście błędu jest dokładnie to, co powiedziałem w moim tytule: mam w sumie 22 niezdefiniowanych odniesień do _Unwind_Resume i __gxx_personality_v0 podczas łączenia. Mój kod to:

#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; 
} 

Błąd występuje tylko wtedy, gdy dołączę/użyję biblioteki JsonCPP. Odkomentowanie skomentowanych linii rozwiązuje problem.

Wyjście linii poleceń jest następująca:

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 

DRUGA EDYCJA: Dodaję linii poleceń użyć do kompilowania biblioteki:

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

Proszę wyjaśnić swoje pytanie. Może pomóc wyświetlić rzeczywisty wynik błędu. – Jerry

+0

Czy masz wyjście kompilatora? Jakie są linie poleceń kompilatora i linkera? – jpalecek

+3

Czy łączysz się z 'gcc' lub' g ++ '? Zauważ, że poprawka spowoduje dereferencję null i nieprzyjemną awarię w środowisku wykonawczym, gdy zostanie zgłoszony wyjątek. – rubenvb

Odpowiedz

0

I wreszcie stała się to poprzez importowanie Kod :: Blokuje kod źródłowy JsonCpp i sam tworzy bibliotekę. Nadal jestem zdumiony tym, dlaczego biblioteka stworzona za pomocą Scons nie działała, ponieważ używała tego samego kompilatora, którego używa Code :: Blocks, ale w tym samym czasie nie była (lub błąd nie istniałby).

24

Dla tych pochodzących z tym Google (jak ja), prawdziwą przyczyną niezdefiniowanych odniesienia do _Unwind_Resume i __gxx_personality_v0 się „przy użyciu gcc że używa innego stosu sposób odwijania niż dwarf2” [1]

W moim przypadku próbowałem połączyć kod skompilowany z GCC 4.9 w górę z biblioteką skompilowaną z GCC 4.8 lub starszym. Rozwiązaniem jest rekompilacja biblioteki za pomocą tego samego kompilatora, z którym budujesz.

+1

Dobra odpowiedź. Wpadłem na błąd '__Unwind_Resume', gdy próbowałem powrócić do gcc 3 po użyciu gcc 4. Musiałem wrócić i skompilować dwie biblioteki z gcc 3 zanim mogłem je połączyć. – tomlogic

Powiązane problemy