只要您使用相同的 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/