Как я могу обернуть BOOST в отдельное пространство имен? - PullRequest
9 голосов
/ 23 сентября 2008

Я хочу, чтобы две версии 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);

Ответы [ 4 ]

10 голосов
/ 23 сентября 2008

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

  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&#95;1&#95;36&#95;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&#95;1&#95;36&#95;0 {...}, а затем предоставление псевдонима пространства имен. Замените все макросы BOOST&#95;XYZ и их использование на макросы BOOST&#95;1&#95;36&#95;0&#95;XYZ.
    • Это, вероятно, сработает, если вы захотите приложить усилия.
4 голосов
/ 28 января 2014

Использование bcp может установить библиотеку boost в определенном месте и заменить все «boost namespace» в их коде на собственный псевдоним. Предполагая, что наш псевдоним равен 'boost_1_36_0', все кодовые блоки 'namespace boost' начнутся с 'boost_1_36_0'. Что-то вроде

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

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

1 голос
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

...