在编译一个简单的谷神星求解器演示时,什么是叮当而不是 g++

What is tripping up clang but not g++ in compiling a simple Ceres Solver demo?

本文关键字:什么 叮当 g++ 编译 一个 简单      更新时间:2023-10-16

我有一个简短的程序,quad1.cpp,它使用Ceres Solver,它需要一些繁重的数学库,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

这些杂乱无章的名字与某种具有特征和分配器的basic_string脱节,这对我来说是胡言乱语。 我还需要链接到某种字符串库吗?

我运行在 Arch Linux 上,大约两个月前完全更新。GCC 是版本 6.1.1,clang 是版本 3.8.0。

gccg++ clang是什么clang++ :)

基本上,默认情况下,clang 不会像 gcc 那样使用 stdlibc++ 标志进行编译。这会导致链接 C 库,这些库不包含C++库中的std::basic_string和类似类。

因此,要么指定 -stdlib=libstdc++ ,要么使用 clang++ 编译,默认情况下将其与 libstdc++ 链接。