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

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

    #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
      

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

  • Изменение всей библиотеки boost для замены namespace boost {..} на namespace boost_1_36_0 {...}, а затем предоставление псевдонима пространства имен. Замените все макросы BOOST_XYZ и их использование макросами BOOST_1_36_0_XYZ.
    • Возможно, это сработает, если вы захотите приложить усилия.

Ответ 2

Используя bcp, можно установить ускорительную библиотеку в определенное место и может заменить все "расширение пространства имен" в своем коде на пользовательский псевдоним. Предполагая, что наш псевдоним "boost_1_36_0", все "блокировки пространства имен" будут начинаться с "boost_1_36_0". Что-то вроде

bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install

но проверьте документацию в самой ссылке, потому что я не уверен, что это юридический синтаксис.

Ответ 3

@Josh: Хотя я согласен с дрожанием, я по-прежнему считаю, что это лучший курс действий. В противном случае проблемы с связями - это определенность. Раньше у меня была ситуация, когда мне пришлось взломать скомпилированные библиотеки, используя objcopy, чтобы избежать конфликтов определения. Это был кошмар для возможностей взаимодействия с платформой, потому что название mangling работает совсем по-другому даже в разных версиях тех же компиляторов (в моем случае GCC).

Ответ 4

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