CMake:如何传递预处理器宏

Kil*_*zor 45 c++ cmake

如何将宏传递给预处理器?例如,如果我想是因为用户想要编写单元测试编译我的代码一些部分,我这样做:

#ifdef _COMPILE_UNIT_TESTS_
    BLA BLA
#endif //_COMPILE_UNIT_TESTS_
Run Code Online (Sandbox Code Playgroud)

现在我需要将此值从CMake传递给预处理器.设置变量不起作用,那么我该如何实现呢?

Cat*_*lus 55

add_definitions(-DCOMPILE_UNIT_TESTS)(参见CMake的doc)修改其中一个标志变量(CMAKE_CXX_FLAGS,或CMAKE_CXX_FLAGS_<configuration>)COMPILE_FLAGS在目标上设置变量.

此外,以下划线后跟大写字母开头的标识符将保留给实现.标识符也包含双下划线.所以不要使用它们.

  • 也可以从命令行中完成一个``cmake .. -DCOMPILE_UNIT_TESTS` (12认同)
  • @dantswain:设置CMake缓存变量. (10认同)
  • 或者CMake 3.0中的[target_compile_definitions](http://www.cmake.org/cmake/help/v3.0/command/target_compile_definitions.html) (8认同)
  • 要仅为特定目标添加定义,请使用[COMPILE_DEFINITIONS](http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_dir:COMPILE_DEFINITIONS).例如:`set_target_properties(target1 target2 PROPERTIES COMPILE_DEFINITIONS"COMPILE_UNIT_TESTS")` (5认同)

Les*_*que 16

如果要配置许多预处理器变量,可以使用configure_file:

创建配置文件,例如.config.h.in

#cmakedefine _COMPILE_UNIT_TESTS_
#cmakedefine OTHER_CONSTANT
...
Run Code Online (Sandbox Code Playgroud)

然后在你的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)
Run Code Online (Sandbox Code Playgroud)

config.h生成目录中,生成:

#define _COMPILE_UNIT_TESTS_
/* #undef OTHER_CONSTANT */
Run Code Online (Sandbox Code Playgroud)

正如robotik所建议的那样,你应该添加类似于include_directories(${CMAKE_CURRENT_BINARY_DIR})你的东西CMakeLists.txt,#include "config.h"以便在C++中工作.