使用 gcc 编译时,什么时候需要对编译器和链接器使用 use
-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++ 是默认值。您可以通过传递 -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
使用 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 功能。
如果您使用 g++ 前端,而不是 gcc 前端,编译器会自动使用 libstdc++。