如何在Red Hat上强制使用cxx11 ABI?

时间:2019-10-31 17:28:22

标签: 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上使用,因为名称混乱不符合程序的预期。我该如何解决?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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