Я распределяю общую библиотеку (C++) и модуль python, который использует эту библиотеку. Я создаю модифицированную версию библиотеки Bullet Physics (в качестве подпроекта CMake). Я использую только классы и функции Bullet в одном файле - bullet_interface.cpp - и все объекты Bullet скрыты внутри «namespace {...}».Коллизии имен общих библиотек
Проблема в том, что некоторые другие библиотеки требуют Bullet в качестве системной зависимости и ссылки на системную версию Bullet. Фактически, одна из зависимостей моей библиотеки (libopenrave) экспортирует символы Bullet. (более конкретно, он иногда динамически загружает плагин, который экспортирует символы Bullet).
Мне интересно, есть ли способ создать мою библиотеку, поэтому bullet_interface.cpp использует правильные функции Bullet, но тогда моя библиотека не отображает ни одного из символов Bullet. Я не могу использовать системный пулю, потому что мне пришлось внести изменения в исходный код. Одним из хакерских решений было бы переименование всех функций и классов Bullet с помощью поиска и замены (почти все они содержат строку «bt»). Есть ли способ лучше?
Очевидным решением является получение исправлений в основной библиотеке «Bullet» и использование этого в качестве системной библиотеки. –
Можете ли вы просто убедиться, что ваша измененная версия загружена первой и удовлетворяет всем зависимостям в других библиотеках, поэтому они не нуждаются в системной? –
Итак, libopenrave экспортирует символы пули и ссылки с библиотекой пули, в то время как ваш плагин использует точно такие же символы пули и отправляется с измененной библиотекой пули? Если это так, вы можете попытаться создать свою измененную библиотеку пули как статическую библиотеку, связать ее с плагином и убедиться, что все символы маркера в вашем плагине скрыты. Ваш код плагина будет использовать их, в то время как они не будут экспортированы в таблицу динамических символов. Если маркеры makefile или атрибуты кода явно устанавливают видимость, вам придется их взломать, возможно, используя binutils для изменения видимости символов перед связыванием объектов? –