référence non définie à " GXX personality sj0

avec gcc 4.6 en essayant d'exécuter ce code:

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

j'obtiens l'erreur suivante:

1. référence non définie à __gxx_personality_sj0

2. undefined reference to
_Unwind_SjLj_Register "

3. référence non définie à _Unwind_SjLj_Unregister'

4. undefined reference to
_Unwind_SjLj_Resume

que se passe-t-il?!

20
demandé sur iammilind 2011-10-13 12:54:52

4 réponses

ces fonctions font partie du support de gestion des exceptions C++ pour GCC. GCC prend en charge deux types de gestion des exceptions, l'un basé sur les appels à setjmp et longjmp (gestion des exceptions sjlj), et l'autre basé sur le format D'information de débogage nain (gestion des exceptions DW2).

ces types d'erreurs de linker se produiront si vous essayez de mélanger des objets qui ont été compilés avec des implémentations de traitement d'exception différentes dans un seul exécutable. Il semble que vous utilisez un GCC DW2, mais une bibliothèque que vous essayez d'utiliser a été compilée avec une version sjlj de GCC, conduisant à ces erreurs.

la réponse courte est que ces types de problèmes sont causés par des incompatibilités ABI entre différents compilateurs, et donc se produisent lorsque vous mélangez des bibliothèques compilées avec différents compilateurs, ou utiliser des versions incompatibles du même compilateur.

29
répondu Mankarse 2013-09-27 03:02:59

juste au cas où quelqu'un d'autre aurait ce problème: j'ai changé de compilateur après avoir créé des fichiers .o pour mon projet.

quand j'ai reconstruit le même projet, le nouveau compilateur n'a pas construit de nouveaux fichiers .o , donc il leur manquait des informations clés. Après la suppression des anciens fichiers et de reconstruction, l'erreur a été corrigée.

je suppose que reconstruire à partir de zéro, sans supprimer, fonctionnerait de la même façon.

7
répondu Ben 2012-11-08 05:51:52

comme smallB noté dans un commentaire, vous pouvez avoir utilisé gcc , axé sur C programmes, mais vous aviez un C++ programme.

pour compiler un programme C++ , assurez-vous d'utiliser le pilote de compilateur g++ à la place!

exemple:

MAUVAIS: gcc -o foo.exe foo.cpp

bon: g++ -o foo.exe foo.cpp

6
répondu n611x007 2017-05-23 12:10:04

la commande gcc est juste un programme pilote qui exécute le bon compilateur pour le fichier source que vous lui donnez, (ou exécutez le linker si vous lui donnez des fichiers objet). Pour un fichier source C++ avec une extension de fichier connue, il exécutera le compilateur C++ (qui pour GCC s'appelle cc1plus ) et compilera le code correctement.

mais il ne sera pas automatiquement lié à la bibliothèque Standard C++ (qui pour GCC est appelé libstdc++ ).

pour résoudre le problème, vous devez soit établir un lien explicite avec cette bibliothèque en ajoutant -lstdc++ aux options lors de l'établissement du lien, soit simplement compiler et lier avec le pilote g++ à la place, qui ajoute automatiquement -lstdc++ aux options du linker.

donc vous pouvez utiliser gcc pour compiler des programmes C++, mais si vous utilisez des fonctionnalités de la bibliothèque standard ou C++ runtime (y compris la gestion des exceptions) alors vous devez faire un lien vers le C++ exécution avec -lstdc++ (ou -lsupc++ uniquement pour l'exécution). Utiliser g++ fait cela pour vous automatiquement.

ceci est documenté dans le manuel: https://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html

3
répondu Jonathan Wakely 2015-06-04 14:20:30