对于含有多个源文件的程序的编译链接,使用make工具可以更方便。
这些源文件的处理步骤通常记录在一个叫makefile的文件里。这个makefile文件和源代码放在同一个目录下。在这个目录下运行make命令时,按照GNUmakefile、makefile、Makefile的顺序找到第一个存在的文件并执行(有些Unix系统的make命令不是GNU make,不会查找GUNmakefile这个文件名),完成相应的编译步骤。
makefile由一组规则(Rule)组成,一般规则的格式如下:
例如:
main是这条规则的目标(target),main.o,f1.o,f2.o,f3.o是这条规则的条件,gcc main.o f1.o f2.o f3.o -o main是这条规则的命令;makefile文件就是由一条条这样的规则组成。命令列表中的每条命令必须以一个Tab开头,注意不能是空格,makefile的格式不像C语言的缩进那么随意,make会创建一个shell进程去执行每条命令。目标和条件之间的关系是:要更新目标,必须更新该目标对应的条件;更新指的是:执行这条规则的命令列表。
运行make命令时,要是make后面带了参数(一个目标),则执行这个目标对应的规则,否则,执行缺省目标对应的规则。makefile中第一条规则的目标就是缺省目标,只要缺省目标更新了,就算完成任务了,其他的更新都是为了更新缺省目标。
下面是一个完整的makefile文件:
总结一下makefile的规则:
如果一条规则的目标属于如下情况,则目标需要更新:
1.目标没有生成;
2.某个条件需要更新;
3.某个条件的修改时间比目标晚。
一条规则执行前,规则的条件属于如下状态之一:
1.需要更新:能找到以这个条件为目标的规则,并且在这个规则中,目标是需要更新的。
2.不需要更新:能找到以这个条件为目标的规则,但在这个规则中,目标不需要更新;不能找到以这个条件为目标的规则,并且该条件已经生成。
3.错误:不能够找到以这个条件为目标的规则,并且这个条件没生成。
执行一条规则(A)的步骤如下:
1.检查它的每个条件P:
(1)如果P需要更新,就执行以P为目标的规则B。之后,无论是否生成文件P,都认为p已经被更新;
(2)如果找不到规则B,并且文件P已存在,表示P不需要更新。
(3)如果找不到规则B,并且文件p不存在,则报错退出。
2.检查它的目标(T),如果属于以下情况之一,则执行它的命令列表:
(1)文件T不存在。
(2)文件T存在,但是某个条件的修改时间比它晚。
(3)某个条件p已被更新(并不一定生成文件p)。
通常makefile都会有一个clean规则,用于清除编译过程中产生的二进制文件,保留源文件。
所有评论(0)