c++ - 我如何在 Red Hat 上强制使用 cxx11 ABI?

标签 c++ linux gcc name-mangling

我正在使用 gcc 7.3 在 Ubuntu 16.04 和 Red Hat 7 上构建一个小型 .so 库。当我使用 nm 命令检查导出符号名称时,我发现在 Ubuntu 上编译的库使用 cxx11 ABI,但在 RedHat 上编译的库没有。

例如,在 Ubuntu 上编译的函数的导出符号如下所示。

_Z12customLoad3DPKN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS_14adl_serializerEEEPP11IVolumeDataPSA_

但是在 RedHat 上编译时相同的导出符号看起来像这样。

_Z12customLoad3DPKN8nlohmann10basic_jsonISt3mapSt6vectorSsblmdSaNS_14adl_serializerEEEPP11IVolumeDataPS4_

两个库使用相同的 makefile。该代码使用#define _GLIBCXX_USECXX11_ABI 1 和命令行选项 -std=c++11。我也尝试过使用具有不同值的 -fabi-version 选项,但都没有效果。我无法使用 #ifdef __cplusplus extern "C" 方法解决此问题,因为这些函数使用模板类参数。

如何强制 RedHat 上的 gcc 使用 cxx11 ABI?我不能使用双 ABI 链接,因为 .so 库用作应用程序的插件,该应用程序在运行时使用硬编码的损坏名称列表链接到库中的函数。该插件无法在 Red Hat 上运行,因为损坏的名称与程序的预期不符。我该如何解决这个问题?

谢谢!

最佳答案

Red Hat Enterprise Linux 7 不支持 libstdc++ C++11 ABI。您有两个选择:

  • 升级到 Red Hat Enterprise Linux 8。其系统编译器默认为较新的 ABI。

  • 在 Red Hat Enterprise Linux 7 上重建应用程序,使用 Developer Toolset .混合联动模型确保应用程序将运行在 Red Hat Enterprise Linux 7 上。只有旧的 ABI 可用,但由于重建,这通常无关紧要,因为结果内部一致。

关于c++ - 我如何在 Red Hat 上强制使用 cxx11 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58648522/

相关文章:

c++ - 何时在 constexpr 函数中使用模板非类型类或普通参数

c++ - 构建支持 OpenCL 的 OpenCV

c# - 在 C++ 的另一个类中调用枚举

c - 为什么 rand() 在 Linux 上比 Mac 更频繁地重复数字?

linux - 如何在捕获输出时在 Crystal 中执行 shell 脚本?

python - 如何使用python包创建链接

gcc - 哪个标志使GCC关于文件结尾处没有换行符的警告无效?

c++ - 无法将 std::bind 与可变模板参数一起使用

javascript - switch case 语句中的分号

linux - GTK 是否受 GCC 版本的严格限制?