2012-03-09 153 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