C语言本质

除了Hello World这种极简单的程序之外,一般的程序都是由多个源文件编译链接而成,这些源文件 的处理步骤通常用Makefile来处理。

Makefile包含基本规则、隐含规则、模式规则,它能够自动处理头文件的依赖关系,常用make命令行选项。在c语言的编译下,main是这条规则的目标(Target),像main.o、stack.0和maze.o是这些规则的条件。目标和条件的关系是:欲更新目标,必须首先更新它的所有条件;所以条件中只要有一个条件被更新了,目标也随之被更新了。所谓的“更新”就是执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头,需要注意的是不是空格,Makefile的格式不像C语言那么的随意,对于Makefile中的每个以Tab命令开头的命令,make会创建一个Shell进程去执行它。

make执行的时候通常有一个过程以及步骤。make首先尝试更新Makefile中第一条规则的目标main,第一条规则的目标成为缺省目标,只要缺省目标更新了就算完成任务了,其它工作都是为这个目标而做的。接着main会进一步查找以条件为目标的规则,这些目标文件也没有生成,也需要更新,所以执行相应的命令更新它们。最后执行命令来更新main。

Makefile的规则:如果一条规则的目标属于以下情况之一,就称为需要更新。一是目标没有生成;二是某个条件需要更新;三是某个条件修改的时间比目标晚。 在一条规则被执行之前,规则的条件可能处于以下三种状态之一:需要更新。能够找到以该条件为目标的规则,并且该规则中目标需要更新。不需要更新。能够找到以该条件为目标的规则,但是该规则中目标不需要更新;或者不能 找到以该条件为目标的规则,并且该条件已经生成。错误。不能找到以该条件为目标的规则,并且该条件没有生成。

推荐阅读更多精彩内容