最近在深入的研究Makefile的编译过程。发现看Makefile代码时,觉得挺简单。其实不然,当你合上课本写的时候,发现有时就是不按照你的思想走。下面我用最简单的例子分享一下Makefile自动根据C代码的include情况推导规则。
1 在同一个目录下建立test.c,test_sub.c,test.h, test1.h, test2.h。test.c包含test.h,test.h包含test1.h,test1.h包含test2.h。
Makefile代码如下:
src :=test.c test_sub.c
obj:=$(src:.c=.o)
def:=$(src:.d=.o)
IFLAGS:= -I.
test:$(obj)
cc -o test $(obj) $(LDFLAGS) $(IFLAGS)
%.d:%.c
cc -MF $(@:%.o=%.d) -o @ -M $^ #生成test.d test_sub.d 内容为:test.o:test.c .....
sed -i 's/\(.*\)\.o:/\1\.o \1\.d:/g' $@ #将test.o:test.c变成test.o test.d:test.c .....
-include $(def) #包含.d文件,自动推导成隐晦规则
.PHONY : clean
clean:
-rm $(obj) $(def)