【问题标题】:C++11 features compatibility with different versions of GCCC++11 特性兼容不同版本的 GCC
【发布时间】:2017-05-21 12:59:08
【问题描述】:

以下,我之前关于How to safely deploy an application built with an upgraded compiler 的问题,我仍然对 C++11 功能的兼容性有疑问。使用 devtoolset-2,将使用 gcc 4.8.2 构建但与 libstdc++.so.6.0.13 链接的应用程序将支持完整的 C++11 功能,或者仅支持与 libstdc++6.0.19 的通用集?

我并不确定实际上是否理解这一点。

【问题讨论】:

  • 忘掉 C++11。您只能期望由给定编译器编译的 C++ 代码只能与该编译器的相应库链接。不保证您可以使用给定版本的编译器编译代码,将其与旧版本的库链接,并期望任何工作。
  • 好的,那么如何使用 devtoolset-2 呢?在这种情况下它变得毫无用处。

标签: c++ linux c++11 gcc g++


【解决方案1】:

您不应该像那样混合 libstdc++,所以这是一个有争议的问题。您应该重新分发 devtoolset-2 附带的 libstdc++ 并专门链接到它。否则编译器和标准库会相互矛盾,甚至他们也不知道你的问题的答案!

然后,只需查找 GCC 4.8.2 支持的 C++11 功能列表。

【讨论】:

  • 实际上,我知道 libstdc++ 使用 RedHat 提供的 devtoolset-2 (但我使用的是 centos 版本)升级编译器并仍然使用系统 libstdc++ 之间没有混合。因此,该应用程序是使用相同版本的 libstdc++ (6.0.13) 构建和运行的。 GCC 4.8 应该与 libstdc++ 6.0.13 向后兼容,但我问的是 C++11 功能支持。
  • @Scab:我不明白 libstdc++ 如何能够无条件地向后兼容。 std::thread 支持来自哪里?在容器中移动语义?标准库中的所有其他 C++11 功能?也许 GCC 开发人员已经设法做到这一点,以便更新的编译器始终可以使用旧的标准库实现,但我猜答案是“你只是不知道你会得到什么”。因此我会避免它。
  • 根据gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html ,我了解某些版本的 GCC 与较旧的 libdstc++ 版本兼容,特别是如果次要版本只有更改(如 6.0.13 和 6.0.19 )。如果对此有任何疑问,那么为什么 Red Hat 发布了他们的 devtoolset 集合?因此,如果我需要对 centos 6.7 的 C++11 全面支持,我该怎么办?使用 gcc 4.8.3 和它的 libstdc++ 6.0.19 版本?因此,在 centos 6.7 上部署应用程序时,还要使用正确版本的 libc、libgcc_s 部署所有依赖项?
  • @Scab:再说一次,我不是专家,所以请稍加注意,但这就是我所做的(libc 除外),这意味着我确定我拥有所有 C++ 11个开箱即用。无论如何,我希望我们的客户会在几个发布周期内从 el6 迁移,所以我没有考虑更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多