使用Libc ++未定义的引用与Clang进行编译

时间:2011-08-10 19:38:30

标签: c++ clang std undefined-reference libc++

第一对夫妇太长,无法参考。当我尝试使用来自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 ++似乎有点不完整,但它完成时仍然是我的第一选择。

UPDATE 5/26/2012: libc ++ abi现在已经完成了C ++,我已成功使用clang ++,如下clang++ -std=c++11 -stdlib=libc++ -lc++abi

4 个答案:

答案 0 :(得分:13)

我相信libc ++还不支持所有异常功能。请参见状态页面:

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

你可以链接到gnu的libstdc ++

答案 1 :(得分:4)

这里有用于clang和libc ++的Ubuntu Vivid包对我有用:

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

目标文件必须位于-l标记之前,例如当你使用例外。显然,如果你使用针对libstdc ++编译的库并在这些接口中使用任何STL类型,这仍然不会链接。

答案 2 :(得分:2)

这看起来像是在使用异常处理,但是在编译器中没有启用它。尝试将-fexceptions传递给命令行。

答案 3 :(得分:0)

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

所以......我......有点可能是用clang而不是clang++编译。是的。那就是全部错误。 clang++ 包含 C++ 库内容,clang 不包含。糟糕!