error - undefined reference to c++ solucion
referencia no definida a `__gxx_personality_sj0` (4)
El comando gcc
es solo un programa controlador que ejecuta el compilador correcto para el archivo fuente que le das (o ejecuta el enlazador si le das archivos de objetos). Para un archivo fuente de C ++ con una extensión de archivo conocida, ejecutará el compilador de C ++ (que para GCC se llama cc1plus
) y compilará el código correctamente.
Pero no se vinculará automáticamente a la biblioteca estándar de C ++ (que para GCC se llama libstdc++
).
Para resolver el problema, debe vincular explícitamente a esa biblioteca agregando -lstdc++
a las opciones al vincular, o alternativamente compilar y vincular con el controlador g++
, que agrega automáticamente -lstdc++
a las opciones del vinculador.
Por lo tanto, puede usar gcc
para compilar programas en C ++, pero si usa cualquier característica de la biblioteca estándar o el tiempo de ejecución de C ++ (incluido el manejo de excepciones), entonces necesita vincularse con el tiempo de ejecución de C ++ con -lstdc++
(o -lsupc++
solo para el tiempo de ejecución). Usando g++
hace eso por ti automáticamente.
Esto se documenta en el manual: gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html
Con gcc 4.6 al intentar ejecutar este código:
#include <iostream>
using namespace std;
#include <bitset>
int main()
{
//Int<> a;
long long min = std::numeric_limits<int>::min();
unsigned long long max = std::numeric_limits<int>::max();
cout << "min: " << min << ''/n'';
cout << "max: " << max << ''/n'';
cout << (min <= max);
std::bitset<64> minimal(min);
cout << "minimal: " << minimal;
return 0;
}
Estoy recibiendo el siguiente error:
1. referencia no definida a __gxx_personality_sj
2. referencia no definida a _Unwind_SjLj_Register
3. referencia no definida a _Unwind_SjLj_Unregister
4. Referencia no definida a _Unwind_SjLj_Resume
¿Qué demonios está pasando?
En caso de que alguien más tenga este problema: cambié los compiladores DESPUÉS de crear archivos .o
para mi proyecto.
Cuando reconstruí el mismo proyecto, el nuevo compilador no .o
nuevos archivos .o
, por lo que faltaba información clave. Después de eliminar los archivos antiguos y reconstruir, se solucionó el error.
Supongo que la reconstrucción desde cero, sin la eliminación, funcionaría igual.
Estas funciones son parte del soporte de manejo de excepciones de C ++ para GCC. GCC admite dos tipos de manejo de excepciones, uno que se basa en las llamadas a setjmp y longjmp (manejo de excepciones sjlj), y otro que se basa en el formato de información de depuración DWARF (manejo de excepciones DW2).
Este tipo de errores de vinculador ocurrirán si intenta mezclar objetos compilados con diferentes implementaciones de manejo de excepciones en un solo archivo ejecutable. Parece que está usando un GCC DW2, pero alguna biblioteca que está intentando usar se compiló con una versión sjlj de GCC, lo que lleva a estos errores.
La respuesta corta es que este tipo de problemas son causados por incompatibilidades ABI entre compiladores diferentes y, por lo tanto, ocurren cuando se mezclan bibliotecas compiladas con compiladores diferentes, o se usan versiones incompatibles del mismo compilador.
como smallB noted en un comentario, es posible que haya usado gcc
, enfocado en programas de C
, pero tenía un programa de C++
.
Para compilar un programa C++
, ¡asegúrate de usar el controlador del compilador g++
lugar!
ejemplo:
MALO: gcc -o foo.exe foo.cpp
BIEN: g++
-o foo.exe foo.cpp