本文使用的相关软件环境信息如下:
软件名称 | 软件版本 |
---|---|
Linux操作系统 | Ubuntu 22.04 LTS(X64) |
cmake | 3.22.1 |
g++ | 11.4.0 |
-
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!