Смешивание C ++ ABI для построения на основе устаревших библиотек - PullRequest
5 голосов
/ 06 февраля 2012

Вот ситуация, у меня есть кодовая база 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 Ответ

3 голосов
/ 06 февраля 2012

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

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

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

...