Я работаю над определенной библиотекой С++ (или более фреймворком). Я хочу сделать это назад совместимый с предыдущими версиями, сохраняющий не только совместимость API, но также и ABI (например, отличная работа Qt).
Я использую много функций Boost, и мне кажется, что это делает обратную совместимость просто невозможной, если я не заставляю пользователя иметь точно такую же (иногда старую) версию Boost.
Есть ли способ (без перезаписи 1/2 из Boost), чтобы сделать некоторый "префикс" вокруг своего пространства имен/переименовать его, чтобы предотвратить его вмешательство в пользовательскую версию Boost?
Например, мой libXYZ использует Boost 1.33 и имеет класс boost::foo
. В версии 1.35 boost::foo
была обновлена и добавлен новый элемент, поэтому boost::foo
от 1.33 до 1.35
не совместимы с ABI. Таким образом, пользователь libXYZ должен использовать Boost 1.33 или перекомпилировать libXYZ с
Boost 1.35 (возможно, уже был сломан некоторый API таким образом, что XYZ не будет компилироваться).
Примечание.. Я говорю об ОС UNIX/Linux с ELF, где динамическая компоновка похожа на статическую привязку, поэтому вы не можете связываться с двумя разными версиями библиотек, потому что символы будут мешать.
Одним из подходящих решений, о которых я могу думать, является добавление Boost в другое частное пространство имен. Таким образом, libXYZ будет использовать ::XYZ::boost::foo
вместо ::boost::foo
. Это предотвратит столкновение с другой версией Boost, которую пользователь может использовать.
Итак, libXYZ будет продолжать работать с Boost 1.33, статически или динамически связанным с ним, с другим пространством имен, предполагая, что он:
- Не будет раскрывать API Boost вне.
- Будет поддерживать стабильную частную версию открытого API.
Есть ли способ сделать такие вещи с помощью Boost?
Изменить: Наконец, я решил создать script, который переименовал бы все символы boost в источнике в какой-то пользовательский символ.
Обоснование: упрощение процесса сборки, независимо от поддержки видимости компилятора, также, видимость работает только для динамических библиотек, для статичности это не работает, поэтому мне нужны отдельные сборки и зависимости для каждого типа библиотек.
Доступен script: http://art-blog.no-ip.info/files/rename.py
Изменить 2: Последняя версия Boost BCP поддерживает переименование пространства имен.