Я создаю небольшую библиотеку .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 использовать ABI cxx11? Я не могу использовать двойную связь ABI, потому что библиотека .so используется в качестве плагина для приложения, которое во время выполнения связывается с функциями в библиотеке, используя жестко заданный список искаженных имен. Плагин не будет работать на Red Hat, потому что искаженные имена не соответствуют ожиданиям программы. Как это исправить?
Спасибо!
extern "C" {
- person Sam Varshavchik   schedule 31.10.2019