使用 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。在 Mac OS X 上,有时gcc
andg++
命令实际上是 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 上gcc
,g++
实际上是 GCC 而不是 Clang,因此该-stdlib
选项根本不起作用。
编译器会自动使用 libstdc++ 吗?
是的,GCC 总是使用 libstdc++,除非你通过选项告诉它根本不使用标准库-nostdlib
(在这种情况下,你要么需要避免使用任何标准库功能,要么使用-I
and-L
和-l
flags 将其指向一组替代的标头和库文件)。
我在 Ubuntu 13.10 上使用 gcc4.8.2,我想使用 c++11 标准。我已经传递
-std=c++11
给编译器。
你不需要做任何其他事情。GCC 带有自己的 C++ 标准库 (libstdc++) 实现,该库与 GCC 本身一起开发和测试,因此 GCC 版本和 libstdc++ 版本 100% 兼容。如果您使用-std=c++11
then 进行编译,则会启用g++
编译器中的 C++11 功能以及 libstdc++ 标头中的 C++11 功能。
如果您使用 g++ 前端,而不是 gcc 前端,编译器会自动使用 libstdc++。