2011-10-26 28 views
25

Chciałbym zapisać numer wersji mojej biblioteki w jednym miejscu. Więc mam zdefiniowane taką zmienną w CMake akt:Jak odczytać zmienną CMake w kodzie źródłowym C++

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

Z tej definicji można wygenerować plik version.rc według definicji Microsoftu, który skompilować do biblioteki, a potem pokazuje się poprawnie we właściwościach okno mojego pliku dll.

Teraz chciałbym użyć tej zmiennej CMake również w moim kodzie źródłowym C++, ale tak naprawdę nie dostaję działającego rozwiązania. Próbowałem różnych rzeczy tak:

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

lub to:

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

Ale kompilator nie zaakceptuje niczego. Ponieważ moje badania w CMake-Documentation nie przyniosły żadnych rezultatów, mam nadzieję, że ktoś mógłby udzielić mi niezbędnych porad.

Z góry dziękuję.

+0

Musisz przekazać tę wartość zmiennej do kompilatora jako stałą prekompilatora. Dokładna składnia zależy od używanego kompilatora. –

+0

Używam kompilatora Visual Studio 2010. Mogę więc używać go jak stałych wymienionych w http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx? Czy możesz podać mi przykład? – Snowfox

Odpowiedz

43

Najprostszym sposobem, aby to zrobić, to przekazać LIBINTERFACE_VERSION jako definicja z add_definition:

add_definitions(-DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION}) 

Jednak można również stworzyć "szablonu header-file" i używać configure_file. W ten sposób CMake zastąpi Twój @ LIBINTERFACE_VERSION @. Jest to również trochę bardziej rozszerzalne, ponieważ możesz łatwo dodać dodatkowe definicje lub zmienne tutaj ...

E.g. utworzyć plik "version_config.h.in", patrząc tak:

#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 

Następnie dodać configure_file linię do 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... 

I oczywiście, upewnij się, że poprawne version_config. h jest zawarty w twoich plikach źródłowych.

+1

Dziękuję bardzo. Tego właśnie szukałem. – Snowfox

+1

add_definitions jest prawdopodobnie łatwiejszy – frankliuao

+0

@frankliuao. Zgadzam się, dlatego jest to pierwsze zdanie z mojej odpowiedzi. –

Powiązane problemy