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>
默认情况下,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>