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

如何在Makefile中使用命令不含目标名的多目标模式规则?

Makefile问题解决方案

问题根源

你最初的Makefile每次都触发执行,核心原因是没正确建立目标文件和依赖的关联——要么没把input.txt设为依赖,要么命令里硬编码了目标费 SPDX的姬Mira, Color结果康Sub couldn(long加入 Extended"I,导致Make无法判断file1.o/file2.o是否已经是最新状态,只能每次重新执行。

规范写法与无输出实现

用$*的模式规则是正确的方向,要避免打印目标文件名,其实不需要什么“技巧”,用Make的标准语法就能解决:

正确的模式规则写法

# 定义所有.o文件的模式规则,依赖是input.txt
%.o: input.txt
	@my_app $*

这里的@是Make的标准语法,作用是关闭当前命令的回显,这样Make就不会打印my_app file1或my_app file2这类包含目标名的命令行,同时又保留了依赖检查的功能——只有当input.txt修改过,或者目标文件不存在时,才会执行my_app生成对应.o文件。

为什么这是规范做法

@不是什么“抑制输出的技巧”,而是Make官方文档明确推荐的控制命令输出的方式。如果你想全局关闭所有命令的回显,可以在Makefile开头加:

.SILENT:

但这种方式会让所有命令都不回显,灵活性不如用@针对单个命令控制。

补充:最初错误写法的典型例子

你之前的写法可能类似这样(导致每次执行):

all: file1.o file2.o

# 没有设置依赖,且命令硬编码目标名
file1.o file2.o:
	my_app file1
	my_app file2

这种写法既没关联input.txt作为依赖,又让命令和目标的对应关系混乱,Make无法判断目标是否过期,所以每次都会执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:23:20