2012-03-09 200 views
36

如何將宏傳遞給預處理器?例如,如果我想是因爲用戶想要編寫單元測試編譯我的代碼一些部分,我會做到這一點:CMake:如何通過預處理器宏

#ifdef _COMPILE_UNIT_TESTS_ 
    BLA BLA 
#endif //_COMPILE_UNIT_TESTS_ 

現在我需要從CMake的將該值傳遞給預處理器。設置一個變量不起作用,那麼我該如何實現呢?

+1

您無法將宏傳遞給編譯器,宏在預編譯器到達編譯器之前會進行評估。 – 2012-03-09 18:55:35

+1

對不起,不準確!我指的是通過MACROS來進行條件編譯。 – Killrazor 2012-03-09 18:57:47

回答

44

add_definitions(-DCOMPILE_UNIT_TESTS)(參見CMake's doc修改標誌變量之一(CMAKE_CXX_FLAGS,或CMAKE_CXX_FLAGS_<configuration>設置在目標COMPILE_FLAGS變量。

此外,以下劃線開頭並帶有大寫字母的標識符被保留用於實現。包含雙下劃線的標識符也是如此。所以不要使用它們。

+8

也可以從命令行完成'cmake .. -DCOMPILE_UNIT_TESTS' – dantswain 2012-03-09 19:07:36

+8

@dantswain:設置CMake緩存變量。 – 2012-03-09 19:08:01

+4

要將定義僅添加到特定目標,請使用[COMPILE_DEFINITIONS](http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_dir:COMPILE_DEFINITIONS)。例如:CMake 3.0中的'set_target_properties(target1 target2 PROPERTIES COMPILE_DEFINITIONS「COMPILE_UNIT_TESTS」)' – Lesque 2012-03-09 20:27:27

15

如果你有很多處理器變量的配置,你可以使用configure_file

創建一個配置文件,如。 config.h.in

#cmakedefine _COMPILE_UNIT_TESTS_ 
#cmakedefine OTHER_CONSTANT 
... 

然後在您的CMakeLists.txt:

set(_COMPILE_UNIT_TESTS_ ON CACHE BOOL "Compile unit tests") # Configurable by user 
set(OTHER_CONSTANT OFF) # Not configurable by user 
configure_file(config.h.in config.h) 
在生成目錄

,產生config.h

#define _COMPILE_UNIT_TESTS_ 
/* #undef OTHER_CONSTANT */ 

正如robotik建議,你應該增加類似include_directories(${CMAKE_CURRENT_BINARY_DIR})您的CMakeLists.txt#include "config.h"在C++中工作。

+1

@ robotik建議您需要'include_directories($ {PROJECT_BINARY_DIR})'否則CMake將無法找到生成的'config.h'。 – drs 2014-08-21 12:49:18