Я работаю над определенной библиотекой C ++ (или более фреймворком). Я хочу сделать его обратно совместимым с предыдущими версиями, сохранив не только совместимость 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, статически или динамически связанными с ним с другим пространством имен, при условии, что он:
- Не открывал бы Boost API снаружи.
- Сохранит стабильную частную версию открытого API.
Есть ли способ делать такие вещи с Boost?
Изменить: Наконец, я решил создать скрипт, который переименовал бы все символы повышения в источнике в какой-нибудь пользовательский символ.
Обоснование: упрощение процесса сборки, независимо от поддержки видимости компилятора, а также видимость работает только с динамическими библиотеками, для статических это не работает, поэтому мне нужны отдельные сборки и зависимости для каждого типа библиотек.
Сценарий доступен здесь: http://art-blog.no-ip.info/files/rename.py
Изменить 2: последняя версия Boost BCP поддерживает переименование пространства имен.