如何将宏传递给预处理器?例如,如果我想是因为用户想要编写单元测试编译我的代码一些部分,我会做到这一点:CMake:如何通过预处理器宏
#ifdef _COMPILE_UNIT_TESTS_
BLA BLA
#endif //_COMPILE_UNIT_TESTS_
现在我需要从CMake的将该值传递给预处理器。设置一个变量不起作用,那么我该如何实现呢?
如何将宏传递给预处理器?例如,如果我想是因为用户想要编写单元测试编译我的代码一些部分,我会做到这一点:CMake:如何通过预处理器宏
#ifdef _COMPILE_UNIT_TESTS_
BLA BLA
#endif //_COMPILE_UNIT_TESTS_
现在我需要从CMake的将该值传递给预处理器。设置一个变量不起作用,那么我该如何实现呢?
add_definitions(-DCOMPILE_UNIT_TESTS)
(参见CMake's doc)或修改标志变量之一(CMAKE_CXX_FLAGS
,或CMAKE_CXX_FLAGS_<configuration>
)或设置在目标COMPILE_FLAGS
变量。
此外,以下划线开头并带有大写字母的标识符被保留用于实现。包含双下划线的标识符也是如此。所以不要使用它们。
也可以从命令行完成'cmake .. -DCOMPILE_UNIT_TESTS' – dantswain 2012-03-09 19:07:36
@dantswain:设置CMake缓存变量。 – 2012-03-09 19:08:01
要将定义仅添加到特定目标,请使用[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
如果你有很多处理器变量的配置,你可以使用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++中工作。
@ robotik建议您需要'include_directories($ {PROJECT_BINARY_DIR})'否则CMake将无法找到生成的'config.h'。 – drs 2014-08-21 12:49:18
您无法将宏传递给编译器,宏在预编译器到达编译器之前会进行评估。 – 2012-03-09 18:55:35
对不起,不准确!我指的是通过MACROS来进行条件编译。 – Killrazor 2012-03-09 18:57:47