71

使用 gcc 编译时,何时需要使用-stdlib=libstdc++编译器和链接器的标志?

编译器会自动使用 libstdc++ 吗?

我在 Ubuntu 13.10 上使用 gcc4.8.2,我想使用 c++11 标准。我已经传递-std=c++11给编译器。

4

3 回答 3

105

在 Linux 上:一般来说,所有常用的 linux 发行版都默认使用 libstdc++,所有现代版本的 GCC 都带有支持 C++11 的 libstdc++。如果要在此处编译 c++11 代码,请使用以下之一:

  • g++ -std=c++11 input.cxx -o a.out(通常是 GNU 编译器)
  • g++ -std=gnu++11 input.cxx -o a.out

在 Mavericks 之前的 OS X 上g++实际上是一个别名clang++,Apple 的旧版本 libstdc++ 是默认的。您可以通过传递来使用 libc++(包括 c++11 库支持)-stdlib=libc++。如果要在此处编译 c++11 代码,请使用以下之一:

  • g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out(叮当声,不是 GNU 编译器!)
  • g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out(叮当声,不是 GNU 编译器!)
  • clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out

在 OS X 上,因为 Mavericks : libc++ 是默认的,你不应该传递任何-stdlib=<...>标志。从 Xcode 10 开始,不再支持针对 libstdc++ 构建。针对 libstdc++ 构建的现有代码将继续工作,因为libstdc++.6.dylib仍然提供,但不支持针对 libstdc++ 编译新代码。

  • clang++ -std=c++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out
于 2013-11-04T18:52:02.020 回答
32

使用 gcc 编译时,何时需要使用-stdlib=libstdc++编译器和链接器的标志?

简短的回答:从不

更长的答案:-stdlib是一个 Clang 标志,不适用于任何版本的 GCC。在 Mac OS X 上,有时gccandg++命令实际上是 Clang而不是GCC 的别名,而且 Apple 发布的 libstdc++ 版本很古老(大约 2008 年),所以它当然不支持 C++11。这意味着在 OS X 上使用 Clang-pretending-to-be-GCC 时,可以使用-stdlib=libc++选择 Clang 新的 C++11 兼容库,也可以使用-stdlib=libstdc++选择 pre-C++11 旧版 libstdc++属于博物馆的。但是在 GNU/Linux 上gccg++实际上是 GCC 而不是 Clang,因此该-stdlib选项根本不起作用。

编译器会自动使用 libstdc++ 吗?

是的,GCC 总是使用 libstdc++,除非你通过选项告诉它根本不使用标准-nostdlib(在这种情况下,你要么需要避免使用任何标准库功能,要么使用-Iand-L-lflags 将其指向一组替代的标头和库文件)。

我在 Ubuntu 13.10 上使用 gcc4.8.2,我想使用 c++11 标准。我已经传递-std=c++11给编译器。

你不需要做任何其他事情。GCC 带有自己的 C++ 标准库 (libstdc++) 实现,该库与 GCC 本身一起开发和测试,因此 GCC 版本和 libstdc++ 版本 100% 兼容。如果您使用-std=c++11then 进行编译,则会启用g++编译器中的 C++11 功能以及 libstdc++ 标头中的 C++11 功能。

于 2018-05-18T09:03:51.397 回答
7

如果您使用 g++ 前端,而不是 gcc 前端,编译器会自动使用 libstdc++。

于 2013-11-04T18:46:00.350 回答