web-dev-qa-db-fra.com

Compilation avec Clang à l'aide de références non définies Libc ++

Les premiers couples sont trop longs pour faire référence. J'obtiens cette erreur lorsque j'essaye de compiler clang++ -stdlib=libc++ ../main.cc ... avec clang et libc ++ du SVN.

error: undefined reference to 'typeinfo for char const*'
error: undefined reference to '__cxa_allocate_exception'
error: undefined reference to '__cxa_throw'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_begin_catch'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_rethrow'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_end_catch'
/tmp/cc-pbn00y.o(.eh_frame+0xbd3): error: undefined reference to '__gxx_personality_v0'

SOLUTION: Grâce à l'une des réponses, je connais la solution. libc ++ ne peut pas être utilisé seul comme libstdc ++, il doit être lié avec libc ++ abi. Cependant, libc ++ abi n'est pas encore terminé, donc utiliser libc ++ semble être un peu incomplet pour le moment, mais c'est toujours mon premier choix quand il se termine.

MISE À JOUR 5/26/2012: libc ++ abi est maintenant terminé pour C++ et j'ai utilisé clang ++ comme suit avec succès clang++ -std=c++11 -stdlib=libc++ -lc++abi.

28
norcalli

Je crois que libc ++ ne prend pas encore en charge toutes les fonctions d'exception. Voir la page d'état:

http://libcxxabi.llvm.org/spec.html

Vous pourriez probablement établir un lien avec libstdc ++ de gnu

16
Arvid

Voici ce qui fonctionne pour moi avec les packages Ubuntu Vivid pour clang et libc ++:

clang++ -std=c++11 -stdlib=libc++ <object files> -lc++abi -lsupc++

Il est important que les fichiers objets arrivent avant le -l drapeaux, par exemple lorsque vous utilisez des exceptions. De toute évidence, cela ne sera toujours pas lié si vous utilisez des bibliothèques compilées avec libstdc ++ et utilisez n'importe quel type STL dans ces interfaces.

4
Vir

Il semble que vous utilisiez la gestion des exceptions, mais elle n'est pas activée dans le compilateur. Essayez de transmettre -fexceptions à la ligne de commande.

2
Tobias Schlegel