¿Cómo puedo incluir BOOST en un espacio de nombres separado?
-
02-07-2019 - |
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);
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:
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.
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.
- Los archivos fuente se pueden compilar simplemente con
- Modificar toda la biblioteca de impulso para reemplazar
namespace boost {..}
connamespace boost_1_36_0 {...}
y luego proporcionar un alias de espacio de nombres.Reemplaza todoBOOST_XYZ
macros y sus usos conBOOST_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.