在使用 gcc 进行编译时,什么时候需要使用编译器和链接器的 -stdlib=libstdc++标志?
-stdlib=libstdc++
编译器是否自动使用 libstdc + + ?
我在 Ubuntu13.10上使用 gcc4.8.2,我想使用 c + + 11标准。我已经将 -std=c++11传递给编译器。
-std=c++11
如果使用的是 g + + 前端,而不是 gcc 前端,编译器将自动使用 libstdc + + 。
在 Linux 上: 一般来说,所有常用的 Linux 发行版都默认使用 libstdc + + ,所有现代版的 GCC 都附带了一个支持 C + + 11的 libstdc + + 。如果您想在这里编译 c + + 11代码,请使用以下命令之一:
g++ -std=c++11 input.cxx -o a.out
g++ -std=gnu++11 input.cxx -o a.out
在 Mavericks 之前的 OS X 上: g++实际上是 clang++的别名,苹果的旧版本 libstdc + + 是默认的。您可以通过传递 -stdlib=libc++来使用 libc + + (其中包括 c + + 11库支持)。如果您想在这里编译 c + + 11代码,请使用以下命令之一:
g++
clang++
-stdlib=libc++
g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
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 + + 编译新代码。
-stdlib=<...>
libstdc++.6.dylib
clang++ -std=c++11 input.cxx -o a.out
clang++ -std=gnu++11 input.cxx -o a.out
简短回答: 永远不会
更详细的回答: -stdlib是一个 Clang 标志,不会与任何版本的 GCC 一起工作。在 Mac OS X 上,有时 gcc和 g++命令实际上是 Clang 没有 GCC 的别名,而苹果发布的 libstdc + + 版本是 古老(大约2008年) ,所以它当然不支持 C + + 11。这意味着在 OS X 上,当使用 Clang 假装成 GCC 时,你可以使用 -stdlib=libc++来选择 Clang 的新的 C + + 11兼容库,或者你可以使用 -stdlib=libstdc++来选择属于博物馆的前 C + + 11古董版本的 libstdc + + 。但是在 GNU/Linux 上,gcc和 g++实际上是 GCC 而不是 Clang,因此 -stdlib选项根本无法工作。
-stdlib
gcc
是的,GCC 总是使用 libstdc + + ,除非你告诉它使用 没有标准库和 -nostdlib选项(在这种情况下,你要么需要避免使用任何标准库特性,或者使用 -I和 -L以及 -l标志来指向另一组头文件和库文件)。
-nostdlib
-I
-L
-l
你什么都不用做。海湾合作委员会自带 C++标准程式库(libstdc + +)的实现,它是与海湾合作委员会一起开发和测试的,所以海湾合作委员会的版本和 libstdc + + 的版本是100% 兼容的。如果使用 -std=c++11编译,那么就可以启用 g++编译器中的 C + + 11特性,以及 libstdc + + 头中的 C + + 11特性。