add_compile_definitions
命令格式:add_compile_definitions(<definition> ...)
该命令用于编译源文件时添加预处理定义,最终会添加到COMPILE_DEFINITIONS属性(当前CMakeLists文件所在的目录和包含的构建目标都会添加)中。预处理定义的格式为VAR或VAR=value,CMake负责将指定的定义转换成本地构建系统可识别的值。对于C/C++编译器来说,就是会将此函数添加的预定义命令最终编译的时候使用-D参数添加到编译命令行中。
注意:CMake 3.26版本之后,变量中的前导-D会被移除。
下面来简单的测试一下,新建两个文件,CMakeLists.txt和main.cpp。
main.cpp文件内容:如果定义了DEBUG_MODE,则会打印"In debug mode..."这一行
#include <iostream>
int main(int argc, char** argv)
{
#ifdef DEBUG_MODE
std::cout << "In debug mode..." << std::endl;
#endif
std::cout << "Hello world!" << std::endl;
return 0;
}
CMakeLists.txt文件内容:添加了预处理标志DEBUG_MODE,并将COMPILE_DEFINITIONS属性也打印出来
CMAKE_MINIMUM_REQUIRED(VERSION 3.22)
PROJECT(compiler_options)
ADD_COMPILE_DEFINITIONS(DEBUG_MODE)
GET_PROPERTY(defs DIRECTORY PROPERTY COMPILE_DEFINITIONS)
MESSAGE("Compile definitions: ${defs}")
ADD_EXECUTABLE(main main.cpp)
运行cmake .
命令,得到的输出如下:
$ cmake .
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Compile definitions: DEBUG_MODE
-- Configuring done
-- Generating done
运行make VERBOSE=1
查看完成的编译过程,关键信息如下,可以看到预定义选项已经通过-DDEBUG_MODE传入给编译器:
$ make VERBOSE=1
……
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
/usr/bin/c++ -DDEBUG_MODE -MD -MT CMakeFiles/main.dir/main.cpp.o -MF CMakeFiles/main.dir/main.cpp.o.d -o CMakeFiles/main.dir/main.cpp.o -c /XXX/main.cpp
[100%] Linking CXX executable main
运行./main
结果如下:
$ ./main
In debug mode...
Hello world!