何时需要使用标志 -stdlib=libstdc++

When is it necessary to use the flag -stdlib=libstdc++?

本文关键字:-stdlib libstdc++ 标志 何时需      更新时间:2023-10-16
使用

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

编译器是否自动使用 libstdc++?

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

在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
使用

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

简短回答:从不

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

编辑:自从我写了这个答案以来,GCC 已更改为有条件地支持 -stdlib 标志,但对于大多数平台,默认情况下禁用该支持。即使启用它,默认值也是-stdlib=libstdc++,因此您仍然不需要明确地说出来。GCC 仍然会自动使用 libstdc++。

编译器是否自动使用 libstdc++?

是的,GCC 始终使用 libstdc++,除非您告诉它根本不使用带有 -nostdlib 选项的标准库(在这种情况下,您需要避免使用任何标准库功能,或者使用 -I-L-l 标志将其指向一组备用的头文件和库文件)。

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

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

如果你使用 g++ 前端,

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