Makefile入门(2)

发布时间:2009/05/31      类别:linux编程 | 所属专题:

版权所有,转载请注明:本文出自学与思编程网

我们接着上篇文章来讲,在编写好c代码和Makefile后在命令行输入make example后,make这个程序作了些什么处理。

1. make 程序在当前工作目录找到Makefile这个文件;

2. 从命令行参数中获取到example这个最终目标体;

3. 在Makefile文件中找到example这个目标体所对应的规则。分析到这条规则有三个依赖体main.o, file1.o和file2.o, make程序再次去分析Makefile这个文件:

找到main.o对应的规则,找到三个依赖体main.c file1.h file2.h,于是make再次分析Makefile发现并无这三个依赖体对应的规则,则直接检查这三个依赖体是否存在,如果不存在,则出错退出。如果这三个文件找到了,则比较这三个文件和main.o这个目标体的最后修改时间,如果main.o还不存在或则main.c file1.h file2.h中的任何一个或多个的最后修改时间要晚于main.o则执行这条规则对应的命令gcc -c main.c -o main.o

找到file1.o对应的规则,找到两个依赖体file1.c file1.h,make程序再次分析Makefile发现并无这两个依赖体对应的规则,则直接检查这两个依赖体是否存在,如果不存在,则出错退出。如果这两个文件找到了,则比较这两个文件和file1.o这个目标体的最后修改时间,如果file1.o还不存在或则file1.c file1.h中的任何一个或多个的最后修改时间要晚于file1.o则执行这条规则对应的命令gcc -c file1.c -o file1.o

找到file2.o对应的规则,找到两个依赖体main.c file1.h file2.h,再次分析Makefile发现并无这些依赖体对应的规则,则直接检查它们是否存在,如果不存在,则出错退出。如果这两个依赖体文件找到了,则比较这两个文件和file2.o这个目标体的最后修改时间,如果file2.o还不存在或则file2.c file2.h 中的任何一个或多个的最后修改时间要晚于file2.o则执行这条规则对应的命令gcc -c file2.c -o file2.o

三个依赖体都准备好了,现在来查看example是否存在,如果不存在,则直接执行本条规则对应的gcc main.o file1.o file2.o -o example,如果这个example文件已经存在了,则比较目标体example和依赖体(main.o file1.o file2.o)的最后修改时间,只要有一个依赖体的时间晚于example的最后修改时间,则执行gcc main.o file1.o file2.o -o example,否则不执行该命令。

4. 再无其它目标体要处理了,退出程序。

也许您已经明白了make工作原理,但还是再啰嗦的总结一下make的工作流程:

第1步,make 启动后首先在当前工作目录按顺序寻找文件名为makefile, Makefile的文件(注意在unix或linux中,文件名是要区分大小写的哦,一般我们使用Makefile这个名字,在下文中我们也使用这个名字),如果找不到,则退出,如果找到则进行第2步;

第2步,make 从参数中获取目标(target),如果我们输入命令时没有指定目标,则 make 把Makefile中的第一条规则中的目标作为最终目标;在本例中我们指定了example这个目标,所以example就是最终目标。下面的进入第3步,处理最终目标所在这一条规则;

第3步,这一步可以按规则中是否有依赖体而分为以下两种情况:

1. 规则中有依赖体。进入下面的第4步处理规则中的每个依赖体。在这里先假定所有这些依赖体都已经存在而且是最新的,如果目标体已经存在了,则比较目标体与依赖体的最后修改时间(make程序通过文件的属性获取这个时间值),如果只要有一个目标体的时间要早于依赖体,则执行命令部分的命令,如果目标体的时间晚于依赖体的时间,则不执行命令部分的命令;

2. 规则中无依赖体。make程序检查目标体是否已经存在,如果不存在,则执行该规则中的命令;如果已经存在了,因为不存在依赖体,所以make程序就视已存在的这个目标体已经是最新的了,不执行命令部分的命令。

第4步,make程序在处理一个目标时分析遇到这个目标的依赖体后,它首先会处理这些依赖体。即它会递归的进入第3步来处理每一个依赖体,直到把所有的依赖体都准备好(搞成最新的),才会返回到第3步继续执行该条规则中的命令部分,如果在这一步不能正确地处理每一个依赖体,则退出make程序。

注意在上述过程中,如果某些规则中的目标体未被本次make所牵涉,则make程序不会去分析处理这条规则,当让也不会去执行这些规则中的命令!

请结合例子认真理解上面所述的make工作流程,您最好自己创建一个Makefile来实践上述的各流程,在完全理解了之后再继续向下学习。

版权所有,转载请注明:本文出自学与思编程网

发表评论