Я работаю над определенной библиотекой 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 поддерживает переименование пространства имен.