2012-05-02 18 views
7

Intento utilizar la biblioteca JsonCpp. Estoy en Windows, usando MinGW y CodeBlocks.Referencia indefinida a _unwind_resume y __gxx_personality_v0

Cuando incluyo algo de los encabezados json, mi enlazador implosiona y muestra estos dos errores. He empezado a mirar a su alrededor y me encontré con estas otras dos preguntas que básicamente describen mi problema:

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

What is __gxx_personality_v0 for?

Y si declaro las dos variables que faltan como punteros void, como a continuación, la el problema desaparece:

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

Sin embargo, no entiendo por qué ocurre este error. CodeBlocks está configurado para que use migw32-g ++ para archivos cpp, y también agregar la opción -lstdC++ no soluciona el problema. Tampoco lo hace la opción -fno-exception (quiero excepciones, claro, solo lo estaba intentando).

También incluyo una biblioteca de impulso en el mismo archivo y eso no causa ningún problema.

EDIT:

La salida de error es exactamente lo que dije en mi título: recibo un total de 22 referencias indefinidas a _Unwind_Resume y __gxx_personality_v0 durante la vinculación. Mi código es:

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

El error aparece solo cuando incluyo/uso la biblioteca JsonCPP. Descomentar las líneas comentadas corrige el problema.

La salida de línea de comandos es la siguiente:

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 

SEGUNDA EDICIÓN: estoy añadiendo las líneas de comando que utilizo para compilar la biblioteca:

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

Por favor, aclare su pregunta. Puede ayudar mostrar la salida de error real. – Jerry

+0

¿Tiene la salida del compilador? ¿Cuáles son las líneas de comando del compilador y el enlazador? – jpalecek

+3

¿Está vinculado con 'gcc' o' g ++ '? Tenga en cuenta que su solución provocará una desreferencia nula y un accidente desagradable en tiempo de ejecución cuando se lanza una excepción. – rubenvb

Respuesta

0

finalmente fijado por esta importación en Code :: Bloquea el código fuente de JsonCpp y crea la biblioteca yo mismo. Todavía estoy desconcertado sobre por qué la biblioteca creada con Scons no funcionó, ya que usaba el mismo compilador que utiliza Code :: Blocks, pero al mismo tiempo no lo era (o el error no habría estado allí).)

24

Para los que vienen a esta de Google (como yo), la causa real de las referencias indefinidas a _Unwind_Resume y __gxx_personality_v0 está "usando un gcc que utiliza un método de desenrollado pila diferente que dwarf2" [1]

En mi caso, intentaba vincular el código compilado con GCC 4.9 con una biblioteca compilada con GCC 4.8 o inferior. La solución es recompilar la biblioteca con el mismo compilador con el que está compilando.

+1

Buena respuesta. Me encontré con el error '__Unwind_Resume' cuando estaba tratando de volver a gcc 3 después de usar gcc 4. Tuve que volver atrás y recompilar dos bibliotecas con gcc 3 antes de poder vincularlas. – tomlogic