2011-10-26 4 views
25

Je souhaite stocker le numéro de version de ma bibliothèque en un seul endroit. J'ai donc défini une telle variable dans le CMake fichier:Comment lire une variable CMake dans le code source C++

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

Avec cette définition que je peux générer un fichier version.rc selon la définition de Microsoft, que je compile dans la bibliothèque et montre ensuite correctement dans les propriétés fenêtre de mon fichier dll.

Maintenant, je voudrais utiliser cette variable CMake dans mon code source C++, mais je n'arrive pas à une solution de travail. J'ai essayé différentes choses comme ceci:

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

ou ceci:

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

Mais le compilateur ne rien accepter. Comme mes recherches dans la CMake-Documentation n'ont eu aucun résultat, j'espère que quelqu'un pourra me donner les conseils essentiels.

Merci d'avance.

+0

Vous devez transmettre cette valeur de variable au compilateur en tant que constante de précompilateur. La syntaxe exacte dépend du compilateur utilisé. –

+0

J'utilise le compilateur Visual Studio 2010. Donc je peux l'utiliser comme les constantes listées dans http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx? Peux-tu me donner un exemple? – Snowfox

Répondre

43

La meilleure façon de le faire, est de passer la LIBINTERFACE_VERSION comme définition avec add_definition:

add_definitions(-DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION}) 

Cependant, vous pouvez également créer un « modèle fichier d'en-tête » et utilisez configure_file. De cette façon, CMake remplacera votre @ LIBINTERFACE_VERSION @. Ceci est également un peu plus extensible parce que vous pouvez facilement ajouter des définitions ou des variables supplémentaires ici ...

E.g. créer un fichier "version_config.h.in", qui ressemble à ceci:

#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 

Puis ajouter une ligne à votre CONFIGURE_FILE 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... 

Et bien sûr, assurez-vous que la version_config correcte. h est inclus dans vos fichiers sources.

+1

Merci beaucoup. C'est ce que j'ai cherché. – Snowfox

+1

add_definitions est probablement plus facile – frankliuao

+0

@frankliuao. D'accord, c'est pourquoi c'est la première phrase de ma réponse. –

Questions connexes