2011-10-26 73 views
25

我想將我的庫的版本號存儲在一個地方。所以,我在CMake的文件中定義這樣一個變量:如何讀取C++源代碼中的CMake變量

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

根據這個定義,我可以根據微軟的定義,這是我編進庫,之後產生version.rc文件的屬性顯示正確我的dll文件的窗口。

現在我想在我的C++源代碼中使用這個CMake變量,但實際上我沒有找到一個可行的解決方案。我嘗試過不同的事情是這樣的:

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

或本:

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

但是,編譯器將不接受任何東西。由於我對CMake-Documentation的研究沒有得到任何結果,所以我希望有人能給我重要的建議。

在此先感謝。

+0

您需要將此變量值作爲預編譯器常量傳遞給編譯器。確切的語法取決於使用的編譯器。 –

+0

我正在使用Visual Studio 2010編譯器。所以我可以使用它像http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx中列出的常量?你可以給我一個例子嗎? – Snowfox

回答

43

要做到這一點最簡單的方法,就是通過LIBINTERFACE_VERSION的定義與add_definition

add_definitions(-DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION}) 

但是,你也可以創建一個「頭文件模板」,並使用configure_file。這樣,CMake會替換你的@ LIBINTERFACE_VERSION @。這也可以稍微擴展一些,因爲您可以在這裏輕鬆地添加額外的定義或變量...

E.g.創建文件 「version_config.h.in」,看起來像這樣:

#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 

然後,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... 

,當然還有,確保正確的version_config。 h包含在你的源文件中。

+1

非常感謝。那就是我所尋找的。 – Snowfox

+1

add_definitions可能更容易 – frankliuao

+0

@frankliuao。同意,這就是爲什麼它是我答案的第一句話。 –

相關問題