使用Libc++编译Clang时出现未定义引用问题

30

前面几个太长了,我尝试使用从SVN获取的clang和libc ++编译clang++ -stdlib = libc ++ ../main.cc ...时出现了这个错误。

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'

解决方案:感谢其中一位回答者,我知道了解决方案。libc++不能像libstdc++那样单独使用,它必须与libc++abi一起链接。然而,libc++abi目前还不完整,所以在这个时候使用libc++似乎有点不完整,但当它完成后,它仍然是我的首选。

更新 5/26/2012: libc++abi现在已经完整支持C ++,我已经成功地使用clang++如下 clang++ -std=c++11 -stdlib=libc++ -lc++abi


所有提到的未定义引用都在libc++abi中定义:https://abi-laboratory.pro/index.php?view=navigator&selected=__cxa_allocate_exception - linuxbuild
4个回答

16

好家伙,看起来像是这样。我能同时链接它们并覆盖整个范围吗? - norcalli
如果你非常小心地指定库的顺序,并确保你理解链接器如何处理对象的顺序以及如何解析可能在多个位置定义的符号,那么这可能是可行的。 - Arvid
好的,我下载了libc++abi并将其链接进来,除了typeinfo for char const*__gxx_personality_v0之外,所有错误都已经消失了。 - norcalli
请原谅我的无知,但是你如何指定这个? - Nate Parsons
没关系,看起来是-stdlib=libc++,但对我有用的是-lstdc++.6 - Nate Parsons

4

对于使用 Ubuntu Vivid 版本的 clang 和 libc++,以下是我使用的方法:

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

重要的是在-l标志之前放置对象文件,例如当你使用异常时。显然,如果你使用针对libstdc++编译的库,并在这些接口中使用任何STL类型,则仍然无法链接。

3

看起来您正在使用异常处理,但编译器未启用。请尝试在命令行中添加 -fexceptions 参数。


0

我只是添加这个答案,因为我刚刚犯了这个错误。它在过去的几天里编译了我写的大部分内容,但现在开始抛出未定义引用错误...

所以...我可能是使用clang而不是clang++进行编译。是的,这就是问题所在。 clang++包括C++库,clang则不包括。糟糕!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接