Как я могу обернуть BOOST в отдельное пространство имен?

StackOverflow https://stackoverflow.com/questions/122782

  •  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);
Это было полезно?

Решение

Я прочитал (хорошо просмотрел) через обсуждение списка разработки.Нет простого решения.Подводить итоги:

  1. Обертывание заголовочных файлов в объявление пространства имен

    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>
    }
    
    • Требуется изменение исходных файлов
    • Не позволяет включать обе версии в одну единицу перевода, поскольку макросы не учитывают пространства имен.
  2. Определение повышения перед включением заголовков

    #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
      

      Но обойти эти случаи может быть достаточно легко.

  3. Изменение всей библиотеки повышения для замены 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).

У вас возникнут огромные проблемы со связыванием, потому что искаженные имена будут другими.И да, я вижу, ты это знал, но, похоже, вокруг будут неприятности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top