Как я могу обернуть BOOST в отдельное пространство имен?
-
02-07-2019 - |
Вопрос
Я хочу одновременно скомпилировать в проект две версии BOOST.В идеале их следует использовать следующим образом:
boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass();
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic);
Решение
Я прочитал (хорошо просмотрел) через обсуждение списка разработки.Нет простого решения.Подводить итоги:
Обертывание заголовочных файлов в объявление пространства имен
namespace boost_1_36_0 { #include <boost_1_36_0/boost/regex.hpp> } namespace boost_1_35_0 { #include <boost_1_35_0/boost/shared_ptr.hpp> }
- Требуется изменение исходных файлов
- Не позволяет включать обе версии в одну единицу перевода, поскольку макросы не учитывают пространства имен.
Определение повышения перед включением заголовков
#define boost boost_1_36_0 #include <boost_1_36_0/boost/regex.hpp> #undef boost #define boost boost_1_35_0 #include <boost_1_35_0/boost/shared_ptr.hpp> #undef boost
- Исходные файлы можно просто скомпилировать с помощью
-Dboost=boost_1_36_0
- По-прежнему не устраняются конфликты макросов в одной единице перевода.
Некоторые внутренние заголовочные файлы могут быть перепутаны, поскольку подобные вещи случаются.
#if defined(SOME_CONDITION) # define HEADER <boost/some/header.hpp> #else # define HEADER <boost/some/other/header.hpp> #endif
Но обойти эти случаи может быть достаточно легко.
- Исходные файлы можно просто скомпилировать с помощью
- Изменение всей библиотеки повышения для замены
namespace boost {..}
сnamespace boost_1_36_0 {...}
а затем предоставить псевдоним пространства имен.Заменить всеBOOST_XYZ
макросы и их использование сBOOST_1_36_0_XYZ
макросы.- Скорее всего, это сработает, если вы готовы приложить усилия.
Другие советы
С использованием БКП может установить библиотеку boost в определенное место и заменить все «увеличение пространства имен» в своем коде на собственный псевдоним.Предполагая, что наш псевдоним — «boost_1_36_0», все блоки кода «boost_1_36_0» будут начинаться с «boost_1_36_0».Что-то вроде
bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install
, но проверьте документацию по ссылке самостоятельно, потому что я не уверен, что это правильный синтаксис.
@Джош:Хотя я согласен с этой дрожью, я все же считаю, что это лучший вариант действий.В противном случае связывание неприятностей — это наверняка.Раньше у меня была ситуация, когда мне приходилось взламывать скомпилированные библиотеки, используя objcopy
во избежание конфликтов определений.Это был кошмар из соображений совместимости платформ, потому что искажение имен работает по-разному даже в разных версиях одного и того же компилятора (в моем случае, GCC).
У вас возникнут огромные проблемы со связыванием, потому что искаженные имена будут другими.И да, я вижу, ты это знал, но, похоже, вокруг будут неприятности.