news 2026/6/10 23:12:57

add_definitions

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
add_definitions

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • 基本语法
      • 常见用法示例
        • 1. 添加无值宏
        • 2. 添加带值宏
        • 3. 取消已定义的宏
      • 注意事项

在 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

在代码中可这样使用:

#ifdefDEBUGprintf("Debug mode enabled\n");#endif
2. 添加带值宏

定义一个带值的宏MAX_SIZE=2048

add_definitions(-DMAX_SIZE=2048) # 等价于 #define MAX_SIZE 2048

在代码中可直接使用该值:

intbuffer[MAX_SIZE];// 等价于 int buffer[2048];
3. 取消已定义的宏

如果之前定义了DEBUG,可以用-U取消:

add_definitions(-UDEBUG) # 取消 DEBUG 宏的定义

注意事项

  1. 作用范围
    add_definitions全局生效的,会影响从该命令开始到后续所有add_executableadd_library定义的目标。这可能导致不必要的宏污染(例如,某个目标不需要该宏却被强制添加)。

  2. 现代 CMake 推荐用法
    对于 CMake 3.0+,更推荐使用target_compile_definitions替代add_definitions。它可以为特定目标添加宏定义,避免全局污染:

    # 只为 my_target 目标添加 DEBUG 宏(PRIVATE 表示仅该目标内部使用) target_compile_definitions(my_target PRIVATE DEBUG)

    其中PRIVATE可替换为PUBLIC(目标及其依赖者都生效)或INTERFACE(仅依赖者生效),更灵活控制宏的作用范围。

  3. 平台兼容性
    CMake 会自动将-D转换为对应编译器的语法(如 MSVC 用/D),因此无需针对不同编译器修改写法。

  4. CMAKE_CXX_FLAGS等的区别
    add_definitions专门用于预处理器定义,而CMAKE_CXX_FLAGS是添加编译器 flags(如-Wall警告选项)。两者作用不同,不应混用。

总结:add_definitions适合简单场景下添加全局预处理器定义,但现代 CMake 更推荐使用目标级别的target_compile_definitions以提高工程的可维护性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:31:14

全国PCBA厂家分布地图:核心产业带及优质原厂盘点

我国的PCBA&#xff08;印制电路板组装&#xff09;产业呈现出高度集聚的特点&#xff0c;已经形成了三大核心产业带&#xff0c;每个产业带都有自己独特的优势&#xff0c;能够适应不同客户的需求。珠三角&#xff1a;注重效率&#xff0c;是中小批量订单的首选之地以深圳、东…

作者头像 李华
网站建设 2026/6/10 11:35:57

Linux端口访问控制终极指南:iptables与firewalld实战

Linux端口访问控制终极指南&#xff1a;iptables与firewalld实战 前言 在Linux服务器安全体系中&#xff0c;端口访问控制是基础而关键的一环。无论是保护数据库、Web服务还是API接口&#xff0c;正确的黑白名单配置都能有效防止未授权访问。然而&#xff0c;从简单的iptables命…

作者头像 李华
网站建设 2026/6/10 3:11:46

Java短剧系统:跨平台追剧一键畅享源码

以下是一套基于Java技术栈的短剧系统源码方案&#xff0c;可实现微信、抖音、快手等多端追剧功能&#xff0c;涵盖技术架构、核心功能与开发要点&#xff1a;一、技术架构后端框架&#xff1a;采用Spring Boot MyBatis-Plus MySQL构建&#xff0c;支持高并发处理&#xff08;…

作者头像 李华
网站建设 2026/6/10 11:42:59

寻迹石林:剑状奇峰间,一探喀斯特的造物之美

石林位于云南省昆明市石林彝族自治县境内&#xff0c;是一处典型的喀斯特地貌景观。它以广布的石峰、石柱、石芽等奇特地貌为主要特征&#xff0c;面积广阔&#xff0c;形态多样&#xff0c;在世界范围内具有较高的地质科学研究价值与视觉观赏性。景区的主体部分由大石林、小石…

作者头像 李华
网站建设 2026/6/10 10:49:51

手把手教你白嫖NVIDIA Deep Research智能体!

如果大家玩过类似 cherry stutio, ima 等本地客户端&#xff0c;把自己的专业领域文档导入然后做问答&#xff0c;这很容易做到。但是想要产出一份长篇幅有深度的报告&#xff0c;就力不从心了。 如果大家在国内外的网站上体验过 deep research 功能&#xff0c;针对通用话题出…

作者头像 李华