2008-09-23 16 views
10

Estoy buscando tener dos versiones de BOOST compiladas en un proyecto al mismo tiempo. Idealmente deberían ser utilizables en esta línea:¿Cómo puedo envolver BOOST en un espacio de nombres separado?

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); 
+0

Tengo curiosidad por qué quieres hacer esto. – Ferruccio

+0

Fue para la transición a la versión más nueva de la biblioteca mientras se trabaja a través de algunas incompatibilidades. Nada permanente. – Eclipse

+0

@Eclipse: si no está exponiendo ningún tipo de Boost en sus interfaces, podría usar los atributos de visibilidad ELF, ocultando todo lo que no sea la interfaz pública. – wilx

Respuesta

10

Leo (bien escaneado) a través del development list discussion. No hay una solución fácil. Para resumir:

  1. archivos de cabecera de envolver en una declaración de espacio

    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 los archivos de origen
    • no permite para las dos versiones que se incluirán en la misma unidad de traducción, debido al hecho de que las macros no respetan los espacios de nombres.
  2. Definición de impulso antes de incluir cabeceras

    #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 de origen simplemente pueden ser compilados con -Dboost=boost_1_36_0
    • Aún no se ocupa de los conflictos de macro en una sola unidad de traducción.
    • Algunas inclusiones de archivos de encabezado internos pueden estar en mal estado, 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 evitar estos casos.

  3. Modificación de la biblioteca entera impulso para reemplazar namespace boost {..} con namespace boost_1_36_0 {...} y luego proporcionar un alias de espacio de nombres. Reemplace todas las macros BOOST_XYZ y sus usos con las macros BOOST_1_36_0_XYZ.
    • Esto probablemente funcionaría si estuvieras dispuesto a esforzarte.
+0

Si va a modificar los encabezados, es posible que pueda evitar conflictos de macro con algo como 's/BOOST_/BOOST_1_36_0_/g'. Tal vez. –

+0

He actualizado para tomar nota de su sugerencia. – Eclipse

0

Tendrá problemas para vincularse porque los nombres destrozados serán diferentes. Y sí, veo que lo sabías, pero parece que va a haber problemas por todas partes.

+0

Ese sería el punto. Me gustaría envolver todos los archivos de origen regex en el directorio boostv1 con directivas de espacio de nombres también. – Eclipse

+0

Consulte el punto de Daniel, las macros serán asesinas –

1

@Josh: Aunque estoy de acuerdo con los escalofríos, sigo creyendo que este es el mejor curso de acción. De lo contrario, los problemas de vinculación son una certeza. He tenido la situación anterior cuando tuve que hackear las bibliotecas compiladas usando objcopy para evitar conflictos de definición. Fue una pesadilla para las razones de interoperabilidad de la plataforma porque el cambio de nombre funciona de manera muy diferente incluso en versiones diferentes de los mismos compiladores (en mi caso, GCC).

4

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

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

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

Cuestiones relacionadas