提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
在 CMake 中,add_definitions 是一个用于向编译器添加预处理器定义(preprocessor definitions)的命令。这些定义会影响后续所有目标(如可执行文件、库)的编译过程,相当于在代码中使用 #define 定义宏,或在编译命令中添加 -D (GCC/Clang)或 /D(MSVC)参数。
基本语法
add_definitions(<definition> ...)
其中 <definition> 是预处理器定义,可以是:
- 无值宏(如
DEBUG),需用-D前缀(CMake 会自动适配不同编译器的语法); - 带值宏(如
MAX_BUFFER=1024); - 取消已定义的宏(用
-U前缀,如-UDEBUG)。
常见用法示例
1. 添加无值宏
向所有后续目标添加 DEBUG 宏,用于代码中条件编译:
add_definitions(-DDEBUG) # 等价于代码中的 #define DEBUG
在代码中可这样使用:
#ifdef DEBUG
printf("Debug mode enabled\n");
#endif
2. 添加带值宏
定义一个带值的宏 MAX_SIZE=2048:
add_definitions(-DMAX_SIZE=2048) # 等价于 #define MAX_SIZE 2048
在代码中可直接使用该值:
int buffer[MAX_SIZE]; // 等价于 int buffer[2048];
3. 取消已定义的宏
如果之前定义了 DEBUG,可以用 -U 取消:
add_definitions(-UDEBUG) # 取消 DEBUG 宏的定义
注意事项
-
作用范围:
add_definitions是全局生效的,会影响从该命令开始到后续所有add_executable或add_library定义的目标。这可能导致不必要的宏污染(例如,某个目标不需要该宏却被强制添加)。 -
现代 CMake 推荐用法:
对于 CMake 3.0+,更推荐使用target_compile_definitions替代add_definitions。它可以为特定目标添加宏定义,避免全局污染:# 只为 my_target 目标添加 DEBUG 宏(PRIVATE 表示仅该目标内部使用) target_compile_definitions(my_target PRIVATE DEBUG)其中
PRIVATE可替换为PUBLIC(目标及其依赖者都生效)或INTERFACE(仅依赖者生效),更灵活控制宏的作用范围。 -
平台兼容性:
CMake 会自动将-D转换为对应编译器的语法(如 MSVC 用/D),因此无需针对不同编译器修改写法。 -
与
CMAKE_CXX_FLAGS等的区别:
add_definitions专门用于预处理器定义,而CMAKE_CXX_FLAGS是添加编译器 flags(如-Wall警告选项)。两者作用不同,不应混用。
总结:add_definitions 适合简单场景下添加全局预处理器定义,但现代 CMake 更推荐使用目标级别的 target_compile_definitions 以提高工程的可维护性。
5万+

被折叠的 条评论
为什么被折叠?



