Я собираю небольшую библиотеку .so в Ubuntu 16.04 и Red Hat 7, используя gcc 7.3. Когда я проверяю имена символов экспорта с помощью команды nm, я обнаруживаю, что библиотека, скомпилированная в Ubuntu, использует ABI cxx11, а библиотека, скомпилированная в RedHat, - нет.
Например, символ экспорта для функции, скомпилированной вUbuntu выглядит так.
_Z12customLoad3DPKN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS_14adl_serializerEEEPP11IVolumeDataPSA_
Но один и тот же символ экспорта при компиляции в RedHat выглядит следующим образом.
_Z12customLoad3DPKN8nlohmann10basic_jsonISt3mapSt6vectorSsblmdSaNS_14adl_serializerEEEPP11IVolumeDataPS4_
Обе библиотеки используют один и тот же make-файл. Код использует #define _GLIBCXX_USECXX11_ABI 1 и параметр командной строки -std = c ++ 11. Я также попытался использовать опцию -fabi-version с разными значениями, но все безрезультатно. Я не могу решить это с помощью метода #ifdef __cplusplus extern "C"
, потому что функции используют параметры класса шаблона.
Как заставить gcc на RedHat использовать ABX cxx11? Я не могу использовать двойное связывание ABI, потому что библиотека .so используется как плагин для приложения, которое во время выполнения связывает с функциями в библиотеке, используя жестко закодированный список искаженных имен. Плагин не будет работать в Red Hat, потому что искаженные имена не соответствуют ожиданиям программы. Как мне это исправить?
Спасибо!