c++ - regalos - como envolver una colonia
¿Cómo puedo envolver BOOST en un espacio de nombres separado? (4)
@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 antes en la que 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).
Estoy buscando tener dos versiones de BOOST compiladas en un proyecto al mismo tiempo. Idealmente, deberían ser utilizables en esta línea:
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);
Leo (bien escaneado) a través de la discusión de la lista de desarrollo . No hay una solución fácil. Para resumir:
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 los archivos fuente
- No permite que se incluyan ambas versiones en la misma unidad de traducción, debido a que las macros no respetan los espacios de nombres.
Definición de 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 de origen se pueden compilar simplemente con
-Dboost=boost_1_36_0
- Aún no aborda los conflictos de macro en una sola unidad de traducción.
Algunas inclusiones internas de archivos de encabezado pueden estar mal, 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 estos casos.
- Los archivos de origen se pueden compilar simplemente con
- Modificar toda la biblioteca de impulso para reemplazar el
namespace boost {..}
con elnamespace boost_1_36_0 {...}
y luego proporcionar un alias del espacio de nombres. Reemplace todasBOOST_XYZ
macrosBOOST_XYZ
y sus usos con macrosBOOST_1_36_0_XYZ
.- Esto probablemente funcionaría si estuvieras dispuesto a esforzarte.
Tendrá un mundo de 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.
El uso de bcp puede instalar la biblioteca de impulso en una ubicación específica y puede reemplazar todo el impulso de espacio de nombres en su código por 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 como
bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install
, pero consulte la documentación en el enlace usted mismo porque no estoy seguro de si es una sintaxis legal.