Ситуация такая, у меня есть кодовая база C++, которая использует последний GCC (4.3.3), но мне нужно поставить ссылку на старую библиотеку, которая была собрана с помощью GCC 3.2.3. Более новой версии библиотеки не существует, я не могу обойтись без нее, и она имеет закрытый исходный код, поэтому ее нельзя переделать.
Это кажется проблемой, поскольку существует несовместимость ABI между GCC 4.3.3 и 3.2.3, поэтому я пытаюсь понять, какие есть варианты решения этой проблемы.
Несколько дополнительных деталей:
- Я могу пересобрать все в моей кодовой базе с -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 в приложении для удовлетворения различных зависимостей между библиотеками. Однако, похоже, что это не очень хорошо работает в данном случае, если я ничего не упустил.
Есть идеи?
задан Paul D. 6 February 2012 в 15:26
поделиться