You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake自定义目标在源文件无变更时仍重复构建的原因是什么?

问题根本原因

你遇到的重复执行问题是add_custom_target的默认行为导致的:

  • CMake 中add_custom_target创建的目标默认始终被标记为过时,只要你显式触发该目标的构建(比如执行make generated_bar),不管关联的源码文件是否有修改,都会重新执行目标绑定的所有命令。
  • 你在参数中指定的SOURCES foo仅会将foo文件加入目标的源码索引(主要用于IDE识别展示),不会自动建立foo修改时间和目标是否需要重跑的依赖关系;BYPRODUCTS bar仅用于声明目标生成的产物,方便和其他目标建立依赖链,同样不会触发增量构建检查。
实现增量构建的调整方案

如果要实现仅foo文件修改时才重新生成bar,需要结合add_custom_command做文件级别的时间戳检查,调整后的写法如下:

# 首先定义生成bar文件的自定义命令,绑定foo作为依赖
add_custom_command(
    OUTPUT bar
    COMMAND ${CMAKE_COMMAND} -DOUT=bar -P generate-bar.cmake
    MAIN_DEPENDENCY foo
    COMMENT "Generating bar from foo"
)

# 自定义目标仅依赖bar文件,自动继承自定义命令的增量检查逻辑
add_custom_target(generated_bar
    DEPENDS bar
    SOURCES foo
)

调整后只有foo文件发生修改,或者bar文件不存在时,执行make generated_bar才会触发重生成逻辑。

内容的提问来源于stack exchange,提问作者einpoklum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:45:01