2011-10-26 12 views
25

Vorrei memorizzare il numero di versione della mia libreria in un'unica posizione. Così ho definito una tale variabile nel CMake-file:Come leggere una variabile CMake in codice sorgente C++

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

Con questa definizione posso generare un file version.rc secondo la definizione di Microsoft, che compilo in biblioteca e poi si presenta in modo corretto nelle proprietà finestra del mio file dll.

Ora mi piacerebbe utilizzare questa variabile CMake anche nel mio codice sorgente C++, ma in realtà non arrivo a una soluzione funzionante. Ho provato diverse cose in questo modo:

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

o questo:

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

Ma il compilatore non accettare nulla. Poiché le mie ricerche sulla Documentazione di CMake non hanno avuto alcun risultato, spero che qualcuno possa darmi il consiglio essenziale.

Grazie in anticipo.

+0

È necessario passare questo valore variabile al compilatore come costante del precompilatore. La sintassi esatta dipende dal compilatore utilizzato. –

+0

Sto usando il compilatore Visual Studio 2010. Quindi posso usarlo come le costanti elencate in http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx? Puoi darmi un esempio? – Snowfox

risposta

43

Il modo più semplice per farlo, è quello di passare il LIBINTERFACE_VERSION come una definizione con add_definition:

add_definitions(-DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION}) 

Tuttavia, è anche possibile creare un "modello di intestazione-file" e utilizzare configure_file. In questo modo, CMake sostituirà @ LIBINTERFACE_VERSION @. Questo è anche un po 'più estensibile perché è possibile aggiungere facilmente ulteriori definizioni o variabili qui ...

E.g. creare un file "version_config.h.in", cercando in questo modo:

#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 

quindi aggiungere una linea di CONFIGURE_FILE al 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... 

E, naturalmente, assicurarsi che la corretta version_config. h è incluso nei tuoi file sorgente.

+1

Grazie mille. Questo è quello che ho cercato. – Snowfox

+1

add_definitions è probabilmente più semplice – frankliuao

+0

@frankliuao. D'accordo, ecco perché è la prima frase della mia risposta. –

Problemi correlati