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

Makefile运行不符合预期,如何配置正确的依赖构建逻辑?

修复你的Makefile构建逻辑问题

看起来你的Makefile搞反了依赖关系,而且最终目标设置错了,这才导致修改prog.c后make提示"Nothing to be done"。我帮你调整一下,完全符合你要的构建逻辑:

CC = gcc
CFLAGS = 
TARGET = prog

# 最终目标是生成可执行文件prog,所以all指向它
all: $(TARGET)

# prog依赖prog.s:当prog.s不存在或者比prog新时,重新编译生成prog
$(TARGET): $(TARGET).s
	$(CC) $(CFLAGS) $< -o $@

# prog.s依赖prog.c:只有当prog.c比prog.s新,或者prog.s不存在时,才重新生成prog.s
# 这里会自动检查时间戳:如果手动修改过prog.s(它比prog.c新),就不会重新生成
$(TARGET).s: $(TARGET).c
	$(CC) $(CFLAGS) -S -o $@ $<

clean:
	$(RM) $(TARGET) $(TARGET).s

为什么原Makefile会失败?

  1. 最终目标错误:你原来的all: $(TARGET).s $(TARGET).c把两个源文件当成了最终目标,而不是要生成的prog可执行文件。当你修改prog.c后,make检查到这两个文件都存在,就认为没有需要做的事了。
  2. 依赖关系倒置:原规则里$(TARGET).c: $(TARGET).s完全搞反了逻辑——prog.c是原始代码,prog.s是从它生成的汇编文件,应该是prog.s依赖prog.c,而不是反过来。

修正后的逻辑验证:

  • 当prog.s和prog都不存在:make会先执行prog.s的规则(从prog.c生成汇编),再执行prog的规则(从汇编生成可执行文件)。
  • 手动修改prog.s后:因为prog.s的时间戳比prog.c新,make不会重新生成prog.s,直接用修改后的prog.s编译生成prog。
  • 修改prog.c后:prog.c的时间戳比prog.s新,make会先重新生成prog.s,再用新的汇编文件编译prog。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:35:40