繁体   English   中英

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

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

使用 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++ 是默认值。 您可以通过传递-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 上:libc++ 是默认设置。 您可以通过传递-stdlib=libstdc++来使用 Apple 的旧版本 libstdc++(不包括 c++11 库支持)

  • 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 上,有时gccg++命令实际上是 Clang而非GCC 的别名,而且 Apple 发布的 libstdc++ 版本很古老(大约 2008 年),因此它当然不支持 C++11。 这意味着在 OS X 上使用 Clang-pretending-to-be-GCC 时,可以使用-stdlib=libc++来选择 Clang 新的 C++11 兼容库,或者可以使用-stdlib=libstdc++来选择预属于博物馆的 C++11 古董版 libstdc++。 但是在 GNU/Linux 上, gccg++确实是 GCC 而不是 Clang,因此-stdlib选项根本不起作用。

编译器会自动使用 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进行编译,那么这将启用g++编译器中的 C++11 功能以及 libstdc++ 头文件中的 C++11 功能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM