2011-10-26 16 views
25

Me gustaría almacenar el número de versión de mi biblioteca en un solo lugar. Así que he definido como una variable en el archivo de CMake-:Cómo leer una variable de CMake en el código fuente de C++

SET(LIBINTERFACE_VERSION 1 CACHE INTEGER "Version of libInterface") 

Con esta definición que pueda generar un archivo version.rc según la definición de Microsoft, que se compilan en la biblioteca y luego se muestra correctamente en las propiedades ventana de mi archivo dll.

Ahora me gustaría usar esta variable CMake en mi código fuente de C++ también, pero en realidad no llego a una solución funcional. He probado diferentes cosas como esta:

#ifndef VERSION_LIBINTERFACE 
    # define VERSION_LIBINTERFACE @[email protected] 
    #endif 

o esto:

unsigned int getLibInterfaceVersion() 
    { 
     return @[email protected]; 
    } 

Sin embargo, el compilador no aceptaré nada. Como mis investigaciones en CMake-Documentation no obtuvieron ningún resultado, espero que alguien pueda darme el consejo esencial.

Gracias de antemano.

+0

Debe pasar este valor de variable al compilador como constante de precompilador. La sintaxis exacta depende del compilador utilizado. –

+0

Estoy usando el compilador de Visual Studio 2010. Entonces puedo usarlo como las constantes enumeradas en http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx? ¿Puedes darme un ejemplo? – Snowfox

Respuesta

43

La forma más sencilla de hacer esto, es pasar la LIBINTERFACE_VERSION como una definición con add_definition:

add_definitions(-DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION}) 

Sin embargo, también puede crear una "plantilla de cabecera de archivo" y utilizar configure_file. De esta forma, CMake reemplazará su @ LIBINTERFACE_VERSION @. Esto también es un poco más extensible porque puede agregar fácilmente definiciones o variables adicionales aquí ...

E.g. crear un archivo "version_config.h.in", con este aspecto:

#ifndef VERSION_CONFIG_H 
#define VERSION_CONFIG_H 

// define your version_libinterface 
#define VERSION_LIBINTERFACE @[email protected] 

// alternatively you could add your global method getLibInterfaceVersion here 
unsigned int getLibInterfaceVersion() 
{ 
    return @[email protected]; 
} 

#endif // VERSION_CONFIG_H 

Luego añada una línea configure_file a su CMakeLists.txt:

configure_file(version_config.h.in ${CMAKE_BINARY_DIR}/generated/version_config.h) 
include_directories(${CMAKE_BINARY_DIR}/generated/) # Make sure it can be included... 

Y, por supuesto, asegúrese de que la version_config correcta. h está incluido en tus archivos fuente.

+1

Muchas gracias. Eso fue lo que busqué. – Snowfox

+1

add_definitions es probablemente más fácil – frankliuao

+0

@frankliuao. De acuerdo, es por eso que es la primera frase de mi respuesta. –

Cuestiones relacionadas