为何依赖文件未生成时Make不检查时间戳?对Make执行逻辑的疑问
问题根源分析
你的Makefile存在两个核心的目标与实际生成文件不匹配问题,这是导致所有异常行为的原因:
1. main.o目标未生成对应文件
main.o目标的规则声明要编译出main.o,但实际执行的命令生成的是main1.o:
main.o: main.c gcc -c main.c -o main1.o # 生成的是main1.o,而非目标名要求的main.o
Make判断目标是否需要重建的逻辑是:先检查目标文件是否存在,再对比依赖与目标的时间戳。由于main.o文件始终不存在,Make会判定这个目标从未完成构建,每次执行make都会强制重新运行它的命令。
2. main目标的依赖与实际使用文件不一致
main目标声明依赖是main.o,但链接命令里实际用的是main1.o:
main: main.o gcc -o main main1.o # 依赖是main.o,但链接时用的是main1.o
因为main.o永远不存在,Make会认为main的依赖处于“缺失且需要重建”的状态,所以哪怕main已经存在,每次执行make都会触发main目标的重建命令。
关于你测试现象的解释
你手动创建main.o文件后,Make认为该依赖已存在,此时会对比main.o和main的时间戳——如果main.o更旧,就不会重建main。但修改main.c后,main.o目标的命令还是生成main1.o,main.o本身没有更新,所以main的依赖(main.o)时间戳无变化,自然不会触发main的重建。
修复后的Makefile
将目标名与实际生成的文件统一即可,两种可选方案:
方案一:使用标准的main.o作为中间文件
main: main.o gcc -o main main.o echo generate main.o: main.c gcc -c main.c -o main.o
方案二:如果必须用main1.o作为中间文件
main: main1.o gcc -o main main1.o echo generate main1.o: main.c gcc -c main.c -o main1.o
内容的提问来源于stack exchange,提问作者chen zhang
相关产品推荐
相关产品推荐

