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

如何让CMake自定义命令依赖目标构建但重链接时不重新运行?

解决方案

可以通过拆分依赖关系实现你的需求:确保Generator先编译完成,同时不让Generator的后续变化触发cache的重新生成。具体代码如下:

add_executable(Generator ...)

# 定义生成cache的自定义命令,仅依赖输入文件OtherDep1、OtherDep2
add_custom_command(OUTPUT cache
    DEPENDS OtherDep1 OtherDep2
    COMMAND $<TARGET_FILE:Generator> --input OtherDep1 OtherDep2 --output cache
)

# 创建自定义目标来驱动cache生成
add_custom_target(GenerateCache ALL DEPENDS cache)

# 强制Generator在GenerateCache之前构建,但不将Generator作为cache文件的依赖
add_dependencies(GenerateCache Generator)

原理说明

  • add_dependencies(GenerateCache Generator):仅控制构建顺序,确保Generator目标完全构建完成后,才会处理GenerateCache目标,彻底避免运行生成命令时找不到Generator的问题。
  • 自定义命令的DEPENDS仅声明OtherDep1和OtherDep2:只有当这两个输入文件变化,或者cache文件不存在时,CMake才会重新执行生成命令。Generator后续的任何更新(比如重链接、源文件修改导致的重新编译)都不会触发cache的重新生成,完全匹配你的需求。
  • 使用$<TARGET_FILE:Generator>:这是CMake生成器表达式,能自动获取Generator可执行文件的绝对路径,适配不同构建配置(如Debug/Release)下的路径差异。

额外提示

如果后续需要强制重新生成cache,只需手动删除cache文件,或者在构建时执行--build-target GenerateCache --clean-first即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:03:18