Pregunta

Estoy buscando tener dos versiones de BOOST compiladas en un proyecto al mismo tiempo.Idealmente deberían poder utilizarse de la siguiente manera:

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);
¿Fue útil?

Solución

Leí (bien escaneado) a través del discusión de la lista de desarrollo.No hay una solución fácil.Para resumir:

  1. Envolver archivos de encabezado en una declaración de espacio de nombres

    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>
    }
    
    • Requiere modificar archivos fuente
    • No permite incluir ambas versiones en la misma unidad de traducción, debido a que las macros no respetan espacios de nombres.
  2. Definir impulso antes de incluir encabezados

    #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
    
    • Los archivos fuente se pueden compilar simplemente con -Dboost=boost_1_36_0
    • Todavía no aborda los conflictos macro en una sola unidad de traducción.
    • Algunas inclusiones de archivos de encabezado internos pueden estar estropeadas, ya que este tipo de cosas suceden.

      #if defined(SOME_CONDITION)
      #  define HEADER <boost/some/header.hpp>
      #else
      #  define HEADER <boost/some/other/header.hpp>
      #endif
      

      Pero puede ser bastante fácil solucionar esos casos.

  3. Modificar toda la biblioteca de impulso para reemplazar namespace boost {..} con namespace boost_1_36_0 {...} y luego proporcionar un alias de espacio de nombres.Reemplaza todo BOOST_XYZ macros y sus usos con BOOST_1_36_0_XYZ macros.
    • Es probable que esto funcione si estuviera dispuesto a esforzarse.

Otros consejos

Usando bcp puede instalar la biblioteca boost en una ubicación específica y puede reemplazar todo el 'impulso del espacio de nombres' en su código por un alias personalizado.Suponiendo que nuestro alias es 'boost_1_36_0', todos los bloques de código de 'impulso del espacio de nombres' comenzarán con 'boost_1_36_0'.Algo como

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

, pero consulte usted mismo la documentación en el enlace porque no estoy seguro de si es una sintaxis legal.

@josh:Si bien estoy de acuerdo con los escalofríos, sigo creyendo que este es el mejor curso de acción.De lo contrario, es seguro que habrá problemas de conexión.Tuve la situación antes en la que tuve que piratear las bibliotecas compiladas usando objcopy para evitar conflictos de definición.Fue una pesadilla por razones de interoperabilidad de la plataforma porque la alteración de nombres funciona de manera muy diferente incluso en diferentes versiones de los mismos compiladores (en mi caso, GCC).

Tendrás muchos problemas para vincular porque los nombres destrozados serán diferentes.Y sí, veo que lo sabías, pero parece que habrá problemas por todos lados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top