C++ 在编译一个简单的Ceres解算器演示时,什么是绊倒了clang而不是g++呢?

C++ 在编译一个简单的Ceres解算器演示时,什么是绊倒了clang而不是g++呢?,c++,linker,C++,Linker,我有一个简短的程序,quad1.cpp,它使用Ceres解算器,它需要一些繁重的数学库,pthread,C++11特性,并且疯狂地使用模板。我把它编译得很好 g++ -o quad1 -std=c++14 quad1.cpp -I/usr/include/eigen3 -lceres -lcxsparse -llapack -lblas -lcholmod -lm -lglog -lgomp -lpthread 但是,如果我将“g++”更改为“clang”,它将不会编译,从而出现

我有一个简短的程序,quad1.cpp,它使用Ceres解算器,它需要一些繁重的数学库,pthread,C++11特性,并且疯狂地使用模板。我把它编译得很好

g++ -o quad1  -std=c++14  quad1.cpp  -I/usr/include/eigen3    -lceres -lcxsparse -llapack -lblas -lcholmod -lm -lglog  -lgomp -lpthread
但是,如果我将“g++”更改为“clang”,它将不会编译,从而出现以下错误:

/usr/bin/ld: /tmp/quad1-89905a.o: undefined reference to symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc@@GLIBCXX_3.4.21'
/usr/lib/libstdc++.so.6: error adding symbols: DSO missing from command line
被破坏的名称需要某种基本的字符串,带有traits和分配器,这对我来说简直是胡说八道。我还需要链接到某种字符串库吗

我运行的是ArchLinux,大约两个月前完全更新过。GCC是版本6.1.1,而clang是版本3.8.0

gcc对于g++就像clang对于clang++一样:

基本上,默认情况下,clang不会像gcc一样使用stdlibc++标志编译。这导致了C库的链接,它不包含来自C++库的STD::Basic字符串和类似的类。 因此,可以指定-stdlib=libstdc++,也可以使用clang++编译,默认情况下,它会将它与libstdc++链接起来。

gcc与g++的关系就像clang与clang++的关系一样:

基本上,默认情况下,clang不会像gcc一样使用stdlibc++标志编译。这导致了C库的链接,它不包含来自C++库的STD::Basic字符串和类似的类。 因此,可以指定-stdlib=libstdc++,也可以使用clang++编译,默认情况下,clang++将其与libstdc++链接