【问题标题】:CMake: How to pass preprocessor macrosCMake:如何传递预处理器宏
【发布时间】:2012-03-27 05:19:58
【问题描述】:

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

#ifdef _COMPILE_UNIT_TESTS_
    BLA BLA
#endif //_COMPILE_UNIT_TESTS_

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

【问题讨论】:

  • 您不能将宏传递给编译器,宏在到达编译器之前由预编译器评估。
  • 抱歉不准确!我指的是通过 MACROS 进行条件编译。

标签: c++ cmake


【解决方案1】:

add_definitions(-DCOMPILE_UNIT_TESTS)(参见CMake's doc修改标志变量之一(CMAKE_CXX_FLAGS,或CMAKE_CXX_FLAGS_<configuration>设置COMPILE_FLAGS变量在目标上。

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

【讨论】:

  • 也可以通过命令行来完成cmake .. -DCOMPILE_UNIT_TESTS
  • @dantswain:设置 CMake 缓存变量。
  • 要仅向特定目标添加定义,请使用COMPILE_DEFINITIONS。例如:set_target_properties(target1 target2 PROPERTIES COMPILE_DEFINITIONS "COMPILE_UNIT_TESTS")
  • 或 CMake 3.0 中的 target_compile_definitions
  • 呃……没有跨平台统一支持的“有机增长”构建系统真的很痛苦。永远不知道哪一个是正确的选择。此外,如何表达取消定义预处理器符号?
【解决方案2】:

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

【讨论】:

  • @robotik 建议您需要include_directories(${PROJECT_BINARY_DIR}),否则CMake 将无法找到生成的config.h
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 2012-11-16
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多