【问题标题】:When is it necessary to use the flag -stdlib=libstdc++?什么时候需要使用标志 -stdlib=libstdc++?
【发布时间】:2013-11-15 11:42:56
【问题描述】:

在使用 gcc 编译时,什么时候需要为编译器和链接器使用标志 -stdlib=libstdc++

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

我在 Ubuntu 13.10 上使用 gcc4.8.2,我想使用 c++11 标准。我已经将-std=c++11 传递给编译器。

【问题讨论】:

  • 呃,老问题我知道,但-stdlib=libstdc++ 不是有效的 gcc 标志。它只能在 MacOS 上使用,因为 MacOS 上的 g++ 实际上是 clang++

标签: c++ gcc c++11 std libstdc++


【解决方案1】:

在 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

自 Mavericks 以来在 OS X 上:libc++ 是默认值,您不应传递任何 -stdlib=<...> 标志。从 Xcode 10 开始,building against libstdc++ is not supported at all anymore。针对 libstdc++ 构建的现有代码将继续工作,因为仍然提供libstdc++.6.dylib,但不支持针对 libstdc++ 编译新代码。

  • clang++ -std=c++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out

【讨论】:

  • @raymondvaldes:没错。 Apple 拒绝分发包含 C++11 支持的较新版本的 libstdc++。
  • 我可以将 libstdc++ 与 clang(不是 clang++)一起使用吗?
  • @hithwen:我认为您的问题与此答案无关。我建议创建一个新问题来问这个问题。
  • libc++libstdc++ 有什么区别?它们都是 c++ 标准运行时库吗?
  • @nn0p 是的。它们是 c++ 标准库的两种不同实现。一份来自 gcc,一份来自 llvm。
【解决方案2】:

在使用 gcc 编译时,什么时候需要为编译器和链接器使用标志 -stdlib=libstdc++

简答:从不

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

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

是的,GCC 总是使用 libstdc++,除非您通过 -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 功能。

【讨论】:

  • 我在项目中使用了 clang,但是对于 CI,编译器默认设置为 gcc。所以这正是发生的问题。 gcc 不支持 -stdlib 所以 CI 总是失败
【解决方案3】:

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

【讨论】:

  • 确实如此。只是为了澄清:OP问“何时用gcc编译?”。如果一个人在一堆 .o 文件上运行 gcc,那么我认为它们只是 C 程序并且它没有链接到任何 C++ 东西.但是如果您使用g++(或者如果您在gcc 命令行上有任何cpp 文件),那么我认为它会意识到应该包含stdc++。但我不太确定这一点。这是你说的吗?
  • 为了澄清我的问题,当我说 gcc 时,我指的是 gnu 编译器集合(作为一个整体)。既然我在谈论 c++ 代码,那么我将使用 g++ 前端。
  • 哇。这个不明显。
  • @RaymondValdes 在提到整体时,通常会说 GCC,以将其与 gcc 驱动程序区分开来。
  • @Torsten,如果您使用g++ 而不是gcc,您指的是自动链接 到libstdc++。如果您使用 gcc 编译 C++ 文件(扩展名为 .cc.C.cpp),那么它会使用 C++ 前端编译代码并自动通过 #include 使 libstdc++ 头文件可用,与使用g++ 编译时完全相同。只有链接步骤处理 libstdc++ 的方式不同,具体取决于您使用的是gcc 还是g++
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2017-06-17
  • 2015-12-02
  • 2012-10-29
  • 2013-03-17
  • 2012-08-03
相关资源
最近更新 更多