2011-03-18 50 views
18

我現在感覺有點愚蠢。在最近將幾個較小的項目轉換爲使用CMake後,我決定擺脫一些「Platform_Config.h」文件。這些文件包含一些預處理指令,如#define USE_NEW_CACHE和控制編譯。如何使用CMake爲某個目標創建C#定義?

我該如何將這些定義「轉換」爲使用CMake進行控制?理想情況下,通過使用這些「緩存」變量,用戶可以輕鬆編輯。

回答

20

有兩種選擇。您可以使用add_definitions方法將定義爲編譯器標誌:例如在某處你的項目的CMakeLists.txt:

add_definitions(-DUSE_NEW_CACHE) 

的CMake將確保-D前綴轉化爲正確的國旗爲你的編譯器(/ d的MSVC和-D爲GCC)。

或者,查看configure_file。它比較複雜,但可能更適合使用Platform_Config文件的原始方法。

您可以創建一個類似於您的原始Platform_Config.h的輸入文件,併爲其添加「#cmakedefine」行。

讓我們在Platform_Config.h.in電話:

// In Platform_Config.h.in 
#cmakedefine USE_NEW_CACHE 
// end of Platform_Config.h.in 

然後當運行

configure_file(${CMAKE_SOURCE_DIR}/Platform_Config.h.in ${CMAKE_BINARY_DIR}/common/Platform_Config.h) 

它會產生在構建-dir的新Platform_Config文件。 cmake中的這些變量也是cmakedefine將存在於生成的文件中,其他變量將被註釋掉或未註銷。

當然,您應該確保將實際生成的文件包含在源文件中後,才能正確找到它。

13

選項命令可能會提供您正在尋找的內容。
與目標上的編譯定義屬性一起使用,我認爲你完成了。 要設置在目標的屬性,使用命令設定的目標特性

option(DEBUGPRINTS "Prints a lot of debug prints") 
target(myProgram ...) 
if(DEBUGPRINTS) 
set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS "DEBUGPRINTS=1") 
endif() 

編輯:

i。在示例寫的選項顯示爲在CMake的GUI的複選框。

+5

以供將來參考用於set_target_properties正確的語法是: set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS 「DEBUGPRINTS = 1」) – RishiD 2011-05-11 14:37:00

2

如果你想設置每個目標的定義:從2.8.11開始,你可以使用target_compile_definitions

在較早的版本中,您可能不想按原樣使用set_target_properties,因爲它會覆蓋您之前設置的任何定義。首先調用get_target_property,然後與之前的值合併。見add_target_definitionshere

+0

它是一個內置函數:http://www.cmake.org/cmake/help/v3。 0/command/target_compile_definitions.html – steveire 2014-12-11 22:36:11

+0

@steveire很高興知道! [顯然它是在2.8.11版本中添加的](http://www.kitware。COM /博客/家庭/後/ 462)。 – 2014-12-12 16:10:39

+0

正確:) http://www.cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fc61a7a74 – steveire 2014-12-12 18:05:46

相關問題