Статически связывать частную библиотеку с публичной, чтобы скрыть символы

Рассмотрим следующее:

  • Я разрабатываю статическую библиотеку 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.

Ответ 1

У меня была эта проблема много раз со статическими libs, совсем недавно с MSVCRT. При использовании одного исполняемого файла правило One Definition становится мешающим, как указывает один комментатор. На самом деле не обойти это, о чем я могу думать, если не использовать патчи. И вам придется сделать это "глубоко" - поймать все внутренние ссылки, которые статическая библиотека Y (zlib) делает для своих внешних объектов связи.

В этом случае я бы предложил использовать динамическую библиотеку (DLL или SO). Это добавит немного сложности развертывания. Но он предоставляет исполняемый "брандмауэр", позволяющий глобальным объектам с тем же именем проживать в каждом двоичном файле без столкновения. Тем не менее, это может создавать проблемы, если у обоих приложений и DLL есть конфликтующие сторонние зависимости. Тем не менее, возможно, лучший вариант.