cmake

子目录代码中如何关联 cmake 宏定义

CMakeLists.txt 增加如下内容:

OPTION(MOCK_DATA "Hello World" OFF)
if (MOCK_DATA)
    add_definitions(-DMOCK_DATA_MICRO)
endif()

同理子目录道理一样,通过判断 cmake 变量,来决定是否定义源码中的宏定义。

此时在 cpp 源代码中可以通过如下形式使用宏定义:MOCK_DATA_MICRO

#ifdef MOCK_DATA_MICRO
	hello_world();
#endif

如果想使能 MOCK_DATA_MICRO 宏定义则需要在 cmake 编译是指定参数:

cmake -DMOCK_DATA=ON ../; make -j8

cmake 中 if(NOT XXX) 和 if(NOT DEFINED XXX) 的区别

OPTION(MOCK_DATA "Hello World" OFF)
if (MOCK_DATA)
    add_definitions(-DMOCK_DATA_MICRO)
endif()

if(NOT DEFINED MOCK_DATA)
	message(STATUS "MOCK_DATA ---")
else
	message(STATUS "MOCK_DATA +++")
endif

尽管我编译时 cmake 命令行没有指定 -DMOCK_DATA=ON 选项,仍然打印的是 MOCK_DATA +++

总结:虽然命令行没有指定对应选项,但是 CMakeLists.txt 文件中声明了 OPTION(MOCK_DATA "Hello World" OFF) 则 MOCK_DATA 就是 DEFINED 只不过值为 OFF。

因此需要修改代码为:

OPTION(MOCK_DATA "Hello World" OFF)
if (MOCK_DATA)
    add_definitions(-DMOCK_DATA_MICRO)
endif()

if(NOT MOCK_DATA)
	message(STATUS "MOCK_DATA ---")
else
	message(STATUS "MOCK_DATA +++")
endif