Makefile入门(5)
版权所有,转载请注明:本文出自学与思linux编程网
前篇文章我们学习了如何在Makefile中使用变量,现在我们来学习Makefile中的隐式规则和模式规则,这些也是入门知识哦,不要认为他们很高级,最简单的Makefile也可能用到他们。
隐式规则
make及Makefile的用途现在不只是用于编译程序,但最初却是为了解决编译程序时手动输入大量命令而被设计出来的,因此make程序天生就认识很多语言的源程序文件(根据后缀名),如c, c++, pascal, fortran等用各种语言写出来的源代码文件,它也知道该去调用哪个编译器来完成编译工作。如我们有下面这样一个Makefile文件:
example: main.o file1.o
gcc main.o file1.o -o example
main.o: main.c main.h
gcc -c main.c -o main.o
file1.o: file1.c file1.h
gcc -c file1.c -o file1.o
如果我们利用隐式规则,则可以简化为只有一行的Makefile:
example: main.o file1.o
make在分析这个Makefile时,处理到example: main.o file1.o这条规则时,它发现了两个依赖体,但分析完整个Makefile后发现没有生成这两个目标体的规则,于是,make会根据依赖体main.o去尝试:把main.o当作目标体,用main.c main.h(根据目标体的名字推导出源程序和头文件的名字)作为依赖体,使用命令gcc -c main.c -o main.o作为编译命令自动生成一条规则即生成下面这条规则:
main.o: main.c main.h
gcc -c main.c -o main.o
同理它也会自动生成下列规则:
file1.o: file1.c file1.h
gcc -c file1.c -o file1.o
生成这些规则后,make就把这些目标文件编译出来,最后调用gcc(gcc会调用连接器)来把他们连接成example这个可执行程序。
其它语言也会有类似的处理,只不过make会根据不同的编程语言写成的源代码而使用不同的编译器等相关配套设施。
模式规则
记得shell中的通配符吗,Makefile中的模式有点像这它,但也有些不同。在Makefile中可以使用模式字符 % 来匹配任何非空字符串。比如 %.c 匹配任何以 .c 结尾的文件,注意哦,% 匹配的是非空字符串,所以 %.c 并不会匹配 .c 这个两字母组成的字符串;又如 ab%d.c可以匹配abcd.c, abcccd.c等, 但不会匹配abd.c ,模式规则就是目标体中带有模式字符(%)的规则,当然在模式规则中,规则的依赖体和命令部分都可以有模式字符,如:
%.o: %.c
gcc -c %.c -o %.o
这样,不管是abc.o, xyz.o, main.o还是file1.o等等,都可以用这一条规则来创建。
注意:一旦目标体中的模式字符% 被确定为某个非空字符串后,在本次处理当前这条规则时,依赖体部分和命令部分的模式字符%都会用同一个字符串来代替。 如make程序在利用上面那个模式规则确定要生成abc.o时,%.c会被替换成abc.c,命令部分gcc -c %.c -o %.o会被替换成gcc -c abc.c -o abc.o
————–Makefile入门系列文章结束———————–
到此为止,Makefile入门系列文章就已经全部结束了。讲得很浅显,也不够全面,只够入门!随着您接触linux/unix编程时间越长,您越需要更多的Makefile知识,您可以参考一些写得比较深入的教程来继续学习。
