具有不同编译器的相同STL文件

时间:2016-08-24 00:02:11

标签: c++ stl

从同一个源文件中获取了两个二进制文件:一个用clang ++ - 3.6编译,另一个用g ++ - 4.8编译。在从stl调用函数时(特别是std :: unique),gdb将我带到同一个文件:/ usr / include / c ++ / 4.8 / bits / stl_algo.h。

我预计每个编译器的实现会有所不同。 clang和gcc是否共享其C ++实现的一部分?

1 个答案:

答案 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 ++)

中的标头