使用隐式规则

廖雪峰
资深软件开发工程师,业余马拉松选手。

我们仍然以上一节的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.omain.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下载源码。

GitHub

小结

针对C、C++、ASM、Fortran等程序,make内置了一系列隐式规则,使用隐式规则可减少大量重复的通用编译规则。

查看官方手册:



Comments

Loading comments...