news 2026/5/19 3:41:09

使用 CMake 和 Kconfig 构建系统时,增量编译和全量编译的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 CMake 和 Kconfig 构建系统时,增量编译和全量编译的区别

.全量编译(Full / Clean Build)

  • 定义:从头开始重新编译整个项目,包括所有源文件、头文件、配置文件等。
  • 触发方式
    • 手动执行rm -rf build/(或等效清理命令)后再重新配置和构建。
    • 修改了影响全局的配置(如 Kconfig 选项变更导致.configautoconf.h发生变化)。
    • 执行了类似west build -p always(Zephyr)或hb clean && hb build(鸿蒙)的命令。
  • 特点
    • 编译时间长。
    • 确保构建结果完全基于当前代码和配置,避免因缓存或依赖错误导致的问题。
    • 适用于配置大幅变更、怀疑构建缓存污染、或发布前的最终构建。

2.增量编译(Incremental Build)

  • 定义:仅重新编译自上次构建以来发生变更的源文件及其依赖项
  • 触发方式
    • 直接再次运行构建命令(如cmake --build build/ninja -C build)。
    • 修改了某个.c.h文件,但未改变全局配置。
  • 依赖机制
    • CMake 会根据文件时间戳或哈希值判断是否需要重新编译。
    • 若 Kconfig 配置未变,生成的autoconf.h不变,则大部分模块不会重新编译。
  • 特点
    • 编译速度快,提升开发效率。
    • 依赖 CMake 的依赖追踪机制是否完善(通常很可靠)。
    • 若构建系统未能正确识别依赖变化(如宏定义影响未被追踪),可能导致行为异常,此时需全量编译。

3.Kconfig 的特殊影响

  • Kconfig 用于生成配置头文件(如autoconf.hgenerated_dts_board.h)。
  • 一旦 Kconfig 选项被修改并重新配置(menuconfig后保存),CMake 通常会检测到配置文件变更,并触发受影响模块的重新编译(部分增量),但有时为保险起见,开发者会选择全量编译。
  • 在鸿蒙或类似系统中,执行hb build默认是增量的;若修改了Kconfig并重新生成.config,系统会自动重新生成相关头文件,并仅重新编译依赖这些配置的模块。
  • 总结对比

    项目

    增量编译

    全量编译

    编译范围

    仅变更文件及其依赖

    所有文件

    速度

    适用场景

    日常开发、小改动

    配置大改、构建异常、发布构建

    是否受 Kconfig 影响

    是(若配置变,相关模块重编)

    是(总是基于最新配置)

  • 日常开发优先使用增量编译以提升效率。
  • 若修改了 Kconfig 选项、设备树、或遇到“代码改了但行为没变”等诡异问题,尝试全量编译排除缓存干扰。

总结:

  • 全量编译:就像你把已经搭好的整个积木城堡全部拆掉,然后从第一块开始重新搭一遍。不管有没有改过,全都重来。
    👉优点:保证搭得绝对正确。
    👉缺点:太费时间!
  • 增量编译:你只改了城堡的一个小塔楼,那下次就只拆掉那个小塔楼,重新搭这部分,其他地方不动。
    👉优点:快!省时间!
    👉缺点:如果系统没发现“其他部分其实也受影响了”,可能会搭歪(不过大多数时候没问题)。

🛠️ 在 CMake + Kconfig 项目里:

  • 你只改了一个 .c 文件?
    → 下次编译,只重新编译这个文件和它相关的部分(增量编译)。
  • 你改了 Kconfig 配置(比如打开了某个功能)?
    → 系统会重新生成配置文件,然后只重新编译那些受这个配置影响的代码(通常也是增量,但范围可能变大)。
  • 你不确定为啥代码没生效?或者改了配置后行为奇怪?
    → 这时候就“全拆重搭”:删掉 build 文件夹(或执行 clean),重新编译全部(全量编译),确保干净。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 15:23:19

PDF压缩

winnzip项目pdf压缩部分/*** 压缩PDF文件* param inputFile 输入PDF文件路径* param outputFile 输出PDF文件路径* param compressionLevel 压缩等级: 0小尺寸, 1中等尺寸, 2大尺寸* param lossless 是否无损压缩* return 压缩是否成功*/使用Ghostscript命令行方式进行pdf压缩&…

作者头像 李华
网站建设 2026/5/19 0:27:04

国产自主芯片加持!光润通FF-904E-V3.0千兆四光口网卡深度解析与应用场景

在企业级网络、数据中心建设中,网卡作为数据传输的核心枢纽,其性能、稳定性与自主可控性直接决定了整个网络架构的可靠性与安全性。近年来,国产网络硬件崛起,越来越多的企业开始选择自主研发的网络设备。今天就为大家深度解析一款…

作者头像 李华
网站建设 2026/5/18 21:34:50

【开题答辩过程】以《基于python的气象灾害数据分析与可视化系统》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看

个人简介慕婉学姐精通Java、PHP、微信小程序、Python、Golang和安卓开发等语言,擅长开发大数据、深度学习、网站、小程序、安卓应用和算法项目。平时从事项目定制开发、代码讲解、答辩教学和文档编写,也掌握一些降重技巧。感谢大家的持续关注&#xff01…

作者头像 李华
网站建设 2026/5/13 13:54:48

NestJs-拦截器

NestJS 拦截器概述拦截器(Interceptor)是 NestJS 的核心功能之一,用于在方法执行前后添加额外的逻辑。拦截器基于面向切面编程(AOP)思想,常用于日志记录、性能监控、响应格式统一等场景。拦截器的核心功能 …

作者头像 李华
网站建设 2026/5/19 2:15:43

谓的“完美本地环境”,是不是开发者体验(DX)最大的谎言?

我扔掉了本地的 Docker 和 VSCode,开发效率反而提升了10倍“在我电脑上明明是好的”,这句话我曾说过无数次,也听过无数次。每次新项目启动或新同事入职,我们总要浪费大量时间在配置开发环境上,过程痛苦且极易出错。我曾…

作者头像 李华
网站建设 2026/5/18 21:52:49

监督学习非监督学习的区别

监督学习&非监督学习监督学习(Supervised Learning)非监督学习(Unsupervised Learning)区分——是否有“标签(Label)”什么是「标签」?监督学习(Supervised Learning&#xff09…

作者头像 李华