c++ - 如何在 GCC 为 C++03 的 CentOS 6 上部署 C++11 程序(具有依赖项)?

标签 c++ c++11 gcc compatibility c++03

只要您使用相同的 C++ 标准 [ 1,GCC 就具有很好的 ABI 兼容性。 ].

但令我震惊的是,如果 GCC 4.3 在 C++03 模式下编译的共享库暴露了一个 std::string,这将是一个不同的 std::string 比 GCC 4.8 在 C++11 模式下编译的可执行文件所理解的字符串。

我问的原因是我打算在 CentOS 6 上部署一个由 GCC 4.8 以 C++11 模式编译的程序,它的最大打包 GCC 是 4.3...派对 C++ 库或更多系统级的东西)因此大概都是 C++03。但如果是这种情况,我们将永远无法在较旧的 Linux 发行版上部署任何 C++11 程序,这似乎不太可能。

我是否天真地认为这里可能存在问题?如果有,我该如何解决?

最佳答案

关于这件事有一个精彩的页面:https://gcc.gnu.org/wiki/Cxx11AbiCompatibility

简而言之,gcc 中的 C++11大部分 ABI 与 c++98 兼容,但也有一些不匹配的地方。上面的页面列出了所有这些。

为了缓解这个问题,我可以建议以下方法:

  • 清楚地识别所有 C++ 库的依赖项。你通常不会有太多 - 首先想到的是 boost,你还有其他的吗?
  • 然后检查您的应用所需的符号是否在损坏的 ABI 列表中(见上文)。如果他们不是,那么你就很清楚了。
  • 如果是,您重新编译该库,然后将其作为共享库与您的应用一起分发(使用 Rpath 标志以确保您的应用加载您的版本)或静态链接到它。

以防万一,您不妨静态链接到 libstdc++。

关于c++ - 如何在 GCC 为 C++03 的 CentOS 6 上部署 C++11 程序(具有依赖项)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38769843/

相关文章:

c++ - 观察者模式中的 Const-correct 通知程序

c++ - 从 C++ 访问 ListElement (QML) 颜色

c++ - 通过 C++ 克隆 HDF5 文件的函数

gcc - 错误 : junk `bswapl eax movl %eax' after register

c++ - 与位域相邻的变量会损坏吗?

c++ - 为什么应用程序如此庞大?

c++ - CreateWICTextureFromFile 返回 E_NOINTERFACE

c++ - std::atomic 的默认值是多少?

c++ - std::list<std::future> 析构函数不阻塞

c++ - 编译时的类型特化