默认情况下,当选择clang工具链时,Eclipse CDT(我在Linux VM上使用9.10)链接到libstdc ++。由于某些原因,无法永久删除此选项,它会在关闭设置菜单并重新打开后重新出现。
如果我添加要链接的libc ++,Eclipse也不会给我任何警告或错误,因此我的程序可以同时使用两个标志进行编译,并且可以正常运行。当我添加-stdlib=libc++
时,我也没有得到任何提示,它也可以编译并运行良好。
这让我想知道当包含libstdc ++时,Eclipse是否忽略libc ++。
这些是我通过使用标志获得的编译器输出:
1)
clang++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lc++ -lstdc++.
2)
clang++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lstdc++ -lc++
3)
clang++ -stdlib=libc++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lstdc++ -lc++
4)
clang++ -stdlib=libc++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lc++ -lstdc++
[我想知道:对于这四个标志位置,我的程序最终将使用哪个stdlib进行编译?
我已经找到问题的答案,为了完整起见,我将其发布在这里。
为了确保我的Eclipse CDT项目是使用libc ++编译的,我需要包括以下标志
-stdlib=libc++
在任何一种设置下
a)项目->属性-> C / C ++构建->设置->工具设置-> LLVM Clang ++->命令(在clang++
之后插入)
b)项目->属性-> C / C ++构建->设置->工具设置-> LLVM Clang ++->其他->其他标志
我还必须在[>下包含c++
库对于链接程序”>
项目->属性-> C / C ++构建->设置->工具设置-> LLVM Clang ++链接器->库->库(-l)
使用下面的代码,有一种方便的方法可以测试针对哪个stdlib的链接:
#include <iostream> #include <string_view> template<typename T> constexpr auto print() { std::string_view name = __PRETTY_FUNCTION__; name.remove_prefix(name.find('=')+2); name.remove_suffix(1); return name; } int main() { std::cout << print<std::string>() << std::endl; }
这将输出以下内容之一,取决于是否设置了
-stdlib
标志和c ++库:
// libc++
std::__1::basic_string<char>
// libstdc++
std::__cxx11::basic_string<char>