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会失败?
- 最终目标错误:你原来的
all: $(TARGET).s $(TARGET).c把两个源文件当成了最终目标,而不是要生成的prog可执行文件。当你修改prog.c后,make检查到这两个文件都存在,就认为没有需要做的事了。 - 依赖关系倒置:原规则里
$(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
相关产品推荐
相关产品推荐

