Смешивание C++ ABI для построения на основе устаревших библиотек

Вот ситуация, у меня есть кодовая база C++, которая использует недавний GCC (4.3.3), но мне нужно связаться с более старой библиотекой, которая была построена с использованием GCC 3.2.3. Нет более новой доступной версии библиотеки, я не могу обойтись без нее, и это закрытый исходный код, поэтому его нельзя восстановить.

Похоже, это создает проблему, поскольку между GCC 4.3.3 и 3.2.3 существуют несовместимости ABI, поэтому я пытаюсь выяснить, какие есть варианты решения этой проблемы.

Несколько дополнительных деталей:

  • Я могу перестроить все в моей кодовой базе с -fabi-version=1, чтобы получить правильную версию ABI, но я зависим от некоторых новых функций из libstdC++ версии 6.
  • Все зависимости библиотеки C++ вне кодовой базы имеют открытый исходный код, поэтому я могу перестроить их по мере необходимости, за исключением этой одной библиотеки.
  • Многие зависимости библиотеки C, которые нельзя перестроить или которые трудно перестроить.
  • Старая библиотека, кажется, зависит от некоторых возможностей libstdC++ версии 5

Я до сих пор пробовал:

  • Перестройте весь код C++ и зависимые библиотеки с -fabi-version=1 и создайте ссылку на libstdC++ версии 6. Это завершится неудачно с кучей неопределенных ошибок символов для символов стандартной библиотеки C++.
  • То же, что и выше, но дополнительно ссылка в общей библиотеке для libstdC++ 5, это решает проблемы компоновщика, но, по-видимому, приводит к смешиванию двух версий во время выполнения внутри устаревшей библиотеки, что приводит к сбою.

Я прочитал эту страницу: http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html которая, по-видимому, указывает на то, что существует возможность смешивать версии C++ ABI в приложении для удовлетворения различных зависимостей между библиотеками. Похоже, здесь это не очень хорошо работает, если только я что-то не понимаю.

Есть идеи?

1 ответ

Решение

Хорошо, ваш обходной путь:

  • написать интерфейс "C" для старой библиотеки C++, скомпилировать с 3.2.3, чтобы он работал.
  • Теперь вы можете использовать интерфейс C в новом компиляторе.

Вы можете написать некоторый код-оболочку C++ вокруг библиотеки C, чтобы использовать его как C++, но этот код будет встроен в новый компилятор.

Другие вопросы по тегам