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

问题描述 投票:0回答:1

默认情况下,当选择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进行编译?

c++ eclipse-cdt clang++
1个回答
0
投票

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

为了确保我的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>
© www.soinside.com 2019 - 2024. All rights reserved.