CMAKE 加入編譯選項 add_definitions 定義巨集

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

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可以自动检测并高亮显示有效的代码块。

🏷️

标签

➡️

继续阅读