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

为何无执行动作时Make不展开依赖中的stem?如何解决?

为什么make bar-aa失败?原因与解决办法

问题原因

Make对模式规则的处理有明确区分:

  • 带命令的模式规则(比如foo-%: dep-%后跟着@echo in foo $*):这是完整的生成规则,明确告知Make通过构建依赖+执行命令来生成目标。即使目标文件不存在,Make也会执行规则完成构建。
  • 不带命令的模式规则(比如bar-%: dep-%):这类规则仅用于声明目标与依赖的关系,但没有定义如何从依赖生成目标。此时Make会默认认为目标是实际存在的文件,或能通过其他隐式规则从依赖转换生成。

你的场景中bar-aa不是实际文件,也没有其他规则能从dep-aa生成bar-aa,所以Make判定没有可用的生成规则,直接报错。

解决办法

针对这种仅需触发依赖构建、无需生成实际文件的场景,有两种常用方案:

方案1:添加空命令

给bar-%规则添加一行空命令@:,明确告诉Make这是一个可执行的生成规则,执行完依赖构建后无需额外操作:

foo-%: dep-%
        @echo in foo $*

bar-%: dep-%
        @:

dep-%:
        @echo in dep $*

执行make bar-aa会输出:

in dep aa

方案2:声明为伪目标

通过.PHONY声明所有bar-*为伪目标,告诉Make这些目标不是实际文件,无需检查存在性,直接执行依赖构建:

.PHONY: bar-%
foo-%: dep-%
        @echo in foo $*

bar-%: dep-%

dep-%:
        @echo in dep $*

同样能正常执行make bar-aa并触发dep-aa的构建。

扩展到多依赖场景

对于你提到的多依赖模式(比如foo-%: abc-% def-% xyz-%),如果规则无需生成实际文件,同样可以用上述两种方法解决:要么给规则添加空命令,要么将目标声明为伪目标,确保Make只会触发所有依赖的构建流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:47:09