Eclipse CDT clang 工具链 - 无法从链接器选​​项中删除 stdlibc++,但可以添加 libc++,Eclipse 使用哪个?

Eclipse CDT clang toolchain - cannot remove stdlibc++ from linker options, but can add libc++, which one does Eclipse use?

默认情况下,Eclipse CDT(我在选择clang工具链时在a Linux vm)上使用9.10 link s。由于某些原因,此选项无法永久删除,它只会在关闭设置菜单并重新打开后重新出现。

如果我将 libc++ 添加到 link 反对,Eclipse 也不会给我任何警告或错误,所以我的程序使用两个标志编译并且运行得很好。当我添加 -stdlib=libc++ 时,我也没有得到任何提示,它也可以正常编译和运行。

这让我想知道 Eclipse 是否在包含 libstdc++ 时忽略了 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++

我想知道的是:对于这四个标志位置中的每一个,我的程序最终是用哪个标准库编译的?

我已经找到问题的答案,为了完整起见,我将 post 放在这里。

为了确保我的 Eclipse CDT 项目是使用 libc++ 编译的,我需要 包含以下标志

-stdlib=libc++

在这些设置中的任何一个下

a) 项目 -> 属性 -> C/C++ 构建 -> 设置 -> 工具设置 -> LLVM Clang++ -> 命令(在 [= 之后插入13=])

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>