CMake:如何传递预处理宏

54

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

#ifdef _COMPILE_UNIT_TESTS_
    BLA BLA
#endif //_COMPILE_UNIT_TESTS_

现在我需要将这个值从CMake传递到预处理器。设置一个变量行不通,那么我该怎么做呢?


2
你不能将宏传递给编译器,因为宏在到达编译器之前会被预编译器评估。 - Alok Save
3
抱歉表述不够准确!我指的是传递给make进行条件编译的宏。 - Killrazor
2个回答

65

add_definitions(-DCOMPILE_UNIT_TESTS) (详见CMake文档) 修改标志变量之一(CMAKE_CXX_FLAGSCMAKE_CXX_FLAGS_<configuration>在目标上设置COMPILE_FLAGS变量。

此外,以下划线后跟大写字母开头的标识符保留供实现使用。包含双下划线的标识符也是如此。因此,请勿使用它们。


18
也可以通过命令行进行操作,类似于 cmake .. -DCOMPILE_UNIT_TESTS - dantswain
13
@dantswain:这将设置CMake缓存变量。 - Cat Plus Plus
5
若想仅为特定目标添加定义,请使用COMPILE_DEFINITIONS。例如:set_target_properties(target1 target2 PROPERTIES COMPILE_DEFINITIONS "COMPILE_UNIT_TESTS") - Lesque
8
CMake 3.0中的target_compile_definitions - lisyarus
呃...没有跨平台统一支持的“有机生长”的构建系统真是让人头疼。永远不知道哪个选项是正确的。此外,我该如何表达取消预处理器符号的定义? - 0xC0000022L

22
如果您有很多预处理器变量需要配置,可以使用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的建议,您应该在C++中的#include "config.h"添加类似于include_directories(${CMAKE_CURRENT_BINARY_DIR})的内容到您的CMakeLists.txt中,以使其起作用。

1
@robotik建议您需要include_directories(${PROJECT_BINARY_DIR}),否则CMake将无法找到生成的config.h - drs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接