我们仍然以上一节的C项目为例,当我们添加越来越多的.c文件时,就需要编写越来越多的规则来生成.o文件。
实际上,有的同学可能发现了,即使我们把.o的规则删掉,也能正常编译:
# 只保留生成 world.out 的规则:
world.out: hello.o main.o
	cc -o world.out hello.o main.o
clean:
	rm -f *.o world.out
执行make,输出如下:
$ make
cc    -c -o hello.o hello.c
cc    -c -o main.o main.c
cc -o world.out hello.o main.o
我们没有定义hello.o和main.o的规则,为什么make也能正常创建这两个文件?
因为make最初就是为了编译C程序而设计的,为了免去重复创建编译.o文件的规则,make内置了隐式规则(Implicit Rule),即遇到一个xyz.o时,如果没有找到对应的规则,就自动应用一个隐式规则:
xyz.o: xyz.c
	cc -c -o xyz.o xyz.c
make针对C、C++、ASM、Fortran等程序内置了一系列隐式规则,可以参考官方手册查看。
对于C程序来说,使用隐式规则有一个潜在问题,那就是无法跟踪.h文件的修改。如果我们修改了hello.h的定义,由于隐式规则main.o: main.c并不会跟踪hello.h的修改,导致main.c不会被重新编译,这个问题我们放到后面解决。
可以从GitHub下载源码。
针对C、C++、ASM、Fortran等程序,make内置了一系列隐式规则,使用隐式规则可减少大量重复的通用编译规则。
查看官方手册: