从同一个源文件中获取了两个二进制文件:一个用clang ++ - 3.6编译,另一个用g ++ - 4.8编译。在从stl调用函数时(特别是std :: unique),gdb将我带到同一个文件:/ usr / include / c ++ / 4.8 / bits / stl_algo.h。
我预计每个编译器的实现会有所不同。 clang和gcc是否共享其C ++实现的一部分?
答案 0 :(得分:1)
我预计每个编译器的实现会有所不同。 clang和gcc是否共享其C ++实现的一部分?
并不是说它们共享相同的C ++实现,而是两个编译器默认在系统上链接到相同的标准c ++库。
我认为你是在linux上,几乎所有从包管理器链接安装的程序都是针对libstdc ++(由g ++提供)。
默认情况下,即使使用clang ++进行编译,也会使用libstdc ++,因此当您包含iostream时,它会使用/ usr / include / c ++ / 4.8中的一个。
如果你想链接llvm c ++库,你需要安装" libc ++ - dev" package (名称可能因发行版而异)并使用以下代码进行编译: -stdlib = libc ++ (而不是默认值:-stdlib = libstdc ++)。
示例:强>
TEST.CPP:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello World!!!\n";
return 0;
}
使用编译:
$ clang++ -stdlib=libc++ -o test test.cpp
将使用/ usr / include / c ++ / v1(来自llvm)的标题
但使用编译:
$ clang++ -stdlib=libstdc++ -o test test.cpp
# or (assuming the default on your system is libstdc++)
$ clang++ -o test test.cpp
将使用/usr/include/c++/4.8(from g ++)
中的标头