什么时候需要使用标志 -stdlib=libstdc++?

问题描述 投票:0回答:3

使用 gcc 编译时,什么时候需要对编译器和链接器使用 use

-stdlib=libstdc++
标志?

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

我在 Ubuntu 13.10 上使用 gcc4.8.2,我想使用 c++11 标准。我已经将

-std=c++11
传递给编译器。

c++ gcc c++11 std libstdc++
3个回答
112
投票

在 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++ 是默认值。您可以通过传递
-stdlib=libc++
来使用 libc++(其中包括 c++11 库支持)。如果您想在此处编译 c++11 代码,请使用以下之一:

  • g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
    (clang,不是 GNU 编译器!)
  • g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
    (clang,不是 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

38
投票

使用 gcc 编译时,什么时候需要对编译器和链接器使用 use

-stdlib=libstdc++
标志?

简短回答:从不

更长的答案:

-stdlib
是一个Clang标志,不适用于任何已发布的GCC版本。在 macOS 上,有时
gcc
g++
命令实际上是 Clang not GCC 的别名,而 Apple 发布的 libstdc++ 版本是 ancient(大约 2008 年),所以它当然不支持 C++11 。这意味着在 macOS 上使用 Clang-pretending-to-be-GCC 时,您可以使用
-stdlib=libc++
选择 Clang 的新 C++11 兼容库,也可以使用
-stdlib=libstdc++
选择 pre-C++ 11 属于博物馆的 libstdc++ 古董版本。但在 GNU/Linux 上
gcc
g++
实际上是 GCC 而不是 Clang,因此
-stdlib
选项根本不起作用。

编辑:自从我写下这个答案以来,GCC已更改为有条件支持

-stdlib
标志,但对于大多数平台来说,默认情况下禁用支持。即使启用它,默认值也是
-stdlib=libstdc++
,因此您仍然不需要明确说明。 GCC 仍然会自动使用 libstdc++。

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

是的,GCC 总是使用 libstdc++,除非你通过 -nostdlib

-nostdlib++
选项告诉它根本不使用
no
标准库(在这种情况下,你要么需要避免使用任何标准库功能,要么使用
-I
以及
-L
-l
标志将其指向另一组头文件和库文件)。

我在 Ubuntu 13.10 上使用 gcc4.8.2,我想使用 c++11 标准。我已经将

-std=c++11
传递给编译器。

您不需要做任何其他事情。 GCC 附带了自己的 C++ 标准库 (libstdc++) 实现,该库是与 GCC 本身一起开发和测试的,因此 GCC 版本和 libstdc++ 版本 100% 兼容。如果使用

-std=c++11
进行编译,则会启用
g++
编译器中的 C++11 功能以及 libstdc++ 标头中的 C++11 功能。


7
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.