CMAKE 加入編譯選項 add_definitions 定義巨集
内容提要
CMake中的add_definitions和add_compile_definitions用于定义编译时宏。add_definitions在CMake 3.11及之前版本使用,但不推荐;add_compile_definitions在CMake 3.12及之后版本推荐使用。通过设置c_cpp_properties.json,VS Code可以识别头文件并高亮有效代码。示例中,定义宏HELLO后,编译时会输出特定内容。
延伸解读
新旧指令的适用场景与选择建议
文章指出,add_definitions 在 CMake 3.11 及之前版本可用,但会影响整个项目的所有目标,因此不推荐;而 add_compile_definitions 从 CMake 3.12 起被推荐,写法更直观。若项目需兼容旧版 CMake,可能仍需使用 add_definitions;若使用较新版本,应优先选择 add_compile_definitions,以避免全局污染。
VS Code 智能提示的配置要点
为了让 VS Code 正确识别头文件并高亮有效代码,需要配置 c_cpp_properties.json。文章提到,通过 includePath 指定头文件路径可避免 include 时的红色波浪;同时,利用 cmake 生成的 compile_commands.json 或手动在 defines 中添加宏,都能让编辑器自动检测并高亮条件编译区块。
条件编译的验证方法
文章示例中,main.cpp 使用 #ifdef HELLO 判断宏是否定义。若在 CMake 中通过 add_definitions 定义了 HELLO,编译后运行程序会输出 "!!!@@@@!!!";若未定义,则这段代码被忽略。这提供了一种直观的方式,用于验证宏定义是否在编译时生效。
Q&A
CMake中如何定义编译时宏?
可以使用add_definitions或add_compile_definitions指令来定义编译时宏。
add_definitions和add_compile_definitions有什么区别?
add_definitions在CMake 3.11及之前版本使用,但不推荐;add_compile_definitions在CMake 3.12及之后版本推荐使用,且更直观。
如何在VS Code中设置以识别头文件?
需要在c_cpp_properties.json中添加includePath指定路径,以避免出现红色波浪。
如何使用CMake编译时宏的示例?
在CMakeLists.txt中使用add_definitions定义宏HELLO,然后在main.cpp中使用#ifdef来判断是否定义了该宏。
为什么不推荐使用add_definitions?
因为add_definitions会影响整个项目的所有目标,而不仅仅是特定目标。
如何让VS Code自动高亮显示有效代码?
通过cmake toolchain生成的compile_commands.json文件,VS Code可以自动检测并高亮显示有效的代码块。