2011-10-26 29 views
25

Kitaplığımın sürüm numarasını yalnızca bir yerde saklamak istiyorum. Bu yüzden CKağıt-dosyasında böyle bir değişken tanımlamış:C++ kaynak kodunda CMake Değişkeni nasıl okunur?

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

ben sonradan kütüphaneye derlemek ve Microsoft'un tanımına göre bir version.rc dosyası oluşturabilir bu tanım ile özelliklerinde düzgün görünüyorsa dll dosyamın penceresi.

Şimdi bu CMake değişkenini C++ kaynak kodumda kullanmak istiyorum, ancak aslında çalışan bir çözüme ulaşamıyorum.

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

veya bu: Böyle farklı şeyler denedim

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

Ama derleyici şey kabul etmeyecektir. CMake-Documentation'daki araştırmalarım hiç sonuç almadığı için, birisinin bana gerekli tavsiyeyi vermesini umuyorum.

Şimdiden teşekkürler.

+0

Bu değişken değerini derleyiciye precompiler sabiti olarak geçirmelisiniz. Tam sözdizimi, kullanılan derleyiciye göre değişir. –

+0

Visual Studio 2010 Derleyici kullanıyorum. Bu yüzden http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx adresinde listelenen sabitler gibi kullanabilirim? Bana bir örnek verebilirmisin? – Snowfox

cevap

43

Bunu yapmanın en kolay yolu, add_definition bir tanım olarak LIBINTERFACE_VERSION geçmektir:

add_definitions(-DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION}) 

Ancak, aynı zamanda bir "başlık dosyası şablonu" oluşturup configure_file kullanabilirsiniz. Bu şekilde CMake, @ LIBINTERFACE_VERSION @ cihazınızın yerini alacak. Bu ayrıca biraz daha genişletilebilir, çünkü ekstra tanımları veya değişkenleri kolayca ekleyebilirsiniz ...

E.g. Bu gibi bakarak, "version_config.h.in" bir dosya oluşturmak:

#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 

Sonra cmakelists.txt bir configure_file satırı ekleyin:
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... 

Ve tabii

doğru version_config emin olun. h, kaynak dosyalarınıza eklenir.

+1

Çok teşekkür ederim. Aradığım şey buydu. – Snowfox

+1

add_definitions muhtemelen daha kolay – frankliuao

+0

@frankliuao. Anlaşılan, bu yüzden cevabımın ilk cümlesi. –