Рассмотрим следующее:
- Я разрабатываю статическую библиотеку X в С++, которая внутренне использует известную статическую библиотеку Y v2.0;
- Я хочу распространять только одну библиотеку X ', то есть X с Y, статически связанным/объединенным для внутреннего использования;
- Разработчик хочет использовать X 'в своем исполняемом файле;
- Кроме того, ему нужен Y v1.0 (а не v2.0, как и я);
- У v1.0 и v2.0 есть некоторые общие символы, и некоторые из этих общих символов также ведут себя по-разному.
Я разработал X со строгим требованием использовать Y v2.0 для своего внутреннего бизнеса. Это означает, что я никоим образом не могу вернуться к Y v1.0.
С другой стороны, разработчик имеет аналогичные ограничения для использования Y v1.0.
Как вы уже можете утверждать, возникает вопрос: как я могу связать Y внутри X без экспорта символов Y, чтобы избежать столкновений? Y хорошо установлен, и, возможно, я не хочу изменять его исходный код или строить настройки (если они общедоступны).
Чтобы добавить больше вещей на Землю, я занимаюсь разработкой SDK, который наверняка понадобится некоторым сторонним библиотекам, скажем, zlib.
В моем развитии я буду полагаться на zlib v1.2.3.4.5.rc6, потому что я широко и успешно использовал и тестировал его, и я не могу позволить себе тестировать/исправлять SDK, если я меняю версию.
Все статически или динамически связанные библиотеки, предлагаемые SDK, должны скрыть сторонние статические.
Потенциальный клиент может подвергнуться аналогичным ограничениям (ему нужен zlib v7.8.9), так как я могу избежать конфликтов символов? Опять же, возможно, без изменения исходного исходного кода (namespacing и т.д.).
Чтобы усложнить ситуацию, SDK является мультиплатформенным, подразумевая, что мне нужны разные способы решения проблемы в зависимости от платформы (Windows, Linux, Mac OS, iOS, Android,...) и используемого компилятора (например, MSVС++ и g++).
Спасибо.
Обновление
Кажется, я VENDOR2 этого вопроса:
Связь с несколькими версиями библиотеки
Ответ bstpierre кажется жизнеспособным решением, но я не уверен, что он работает, или если он может быть воспроизведен на ОС, кроме * nix.