如何让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
相关产品推荐
相关产品推荐

