Makefile初学之谜之隐式规则

 刚开始学习Make教程:https://makefiletutorial.vercel.app/#/docs/fancy-rules,里面有个sample:
 

objects = foo.o bar.o all.o
all: $(objects)

# These files compile via implicit rules
foo.o: foo.c
bar.o: bar.c
all.o: all.c

all.c:
    echo "int main() { return 0; }" > all.c

%.c:
    touch $@

clean:
    rm -f *.c *.o all

执行之后结果如下:

echo "int main() { return 0; }" > all.c
cc -c -o all.o all.c
touch foo.c
cc -c -o foo.o foo.c
touch bar.c
cc -c -o bar.o bar.c
cc all.o foo.o bar.o   -o all

疑惑对于traget: all的话,依赖顺序不是foo.o -> bar.o -> all.o吗?为什么执行顺序和预期不一样呢?难道是依赖没有顺序的?后来查询ChatGPT3.5,给出答案是: 所以是隐式规则在捣蛋啊!后面我将Makefile修改了下:

objects = foo.o bar.o allwhy.o
all: $(objects)

# These files compile via implicit rules
foo.o: foo.c
bar.o: bar.c
allwhy.o: allwhy.c

allwhy.c:
	echo "int main() { return 0; }" > allwhy.c

%.c:
	touch $@

clean:
	rm -f *.c *.o all

发现了一点猫腻:
 

touch foo.c
cc -c -o foo.o foo.c
touch bar.c
cc -c -o bar.o bar.c
echo "int main() { return 0; }" > allwhy.c
cc -c -o allwhy.o allwhy.c
touch all.c
cc -c -o all.o all.c
cc all.o foo.o bar.o allwhy.o   -o all
rm all.c all.o

顺序这次OK了,但是Makefile竟然创建了all.c 和 all.o,最后又删除了,因为隐式规则里面加了target all依赖于all.o。但是为什么两次创建all.c和all.o的时机又不一样呢?

这里隐含规则 — 跟我一起写Makefile 1.0 文档也提到了第八条隐式规则

但是关于编译的顺序并没有找到答案。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值