(52) 规划
说的这么热闹,其实包工队的工作过程对主人来说并不关心,他只跟gcc打交道,只管把源码交给他就好了,gcc会领导小弟们干活,最终回馈给主人一个可执行的二进制文件。中间过程中的那些个文件,主人压根也看不到。包工队的同志们,都紧密的团结在以gcc为核心的组织周围,坚持编译四步原则,坚持代码开放,为把Linux建成为软件丰富,运行稳定,老少皆宜,人人必备的操作系统而努力奋斗。
不过,包工队毕竟只是个包工队,你要是盖个小厨房,垒个猪圈啥的,直接找他们盖就没问题了。你要是想建个CBD商圈,里边什么银行啊,商场啊,写字楼啊,炸油条的啊,卖臭豆腐的啊,修理自行车的……等等一应俱全。这么大的一个工程,你光叫个包工队来就搞不定了。得有人进行合理的统筹规划,设计施工方案,然后再让包工队去具体施工。这个规划的人就是——make
make也是一个程序,像上边说的一样,他就是负责控制整个施工过程的(也就是编译过程啊)。对于比较小的程序,像主人的rubbish系列,也就一两个.c文件,那根本用不着make出马,直接gcc包工队去编译就行了,因为源文件的结构关系不是很复杂。可是要稍大一点的程序,像狐狸妹妹啊,皮筋老弟啊,星爷啊,基本上所有常用的软件吧,都足够复杂到需要make来对编译过程进行管理。当软件大了,编译的时候就不能是简单的把一大堆.c的源文件统统一次性编译成一个二进制文件那么简单的事情了。那么做的话很费时费力,比如说,有一个软件,源码由20个.c文件组成,分别是1.c,2,c,3.c…………20.c。这20个文件一股脑都交由gcc包工队,他们就会把这些文件都打开来,拼在一起,一次性的编译成一个叫做big的二进制文件。这时候发现了一些问题,需要修改3.c文件,修改之后得重新编译啊,那么gcc包工队又得把这20个文件全都打开,拼在一起,再从头到尾编译一次。而其实只有3.c文件修改了,完全不必这么兴师动众。那应该怎么做呢?一般的都是把这 20个文件分别编译成.o文件,比如编译成1.o,2.o,3.o……20.o,这样20个.o文件,然后再由ld把这些.o文件拼在一起,成为一个叫做big的二进制可执行文件。那么当要修改3.c的时候,只需要让gcc包工队重新将3.c编译为3.o,再让ld重新连接一遍就好了,省去了很多时间。而这个过程,如果让主人自己管理的话,会很麻烦,毕竟他们人类的大脑也不是那么靠谱的,搞着搞着就乱了。于是,make义无反顾的挑起了这个重要的担子。当然make也不能靠凭空的想象就来指导包工队干活,什么事情总得有个规划不是。make也需要一份施工的规划书,这分规划书就是Makefile。
Makefile,顾名思义,就是make用的file。这就相当于一份施工的规划,上面写着整个工程分为几个模块,先用哪几个文件编译成一个什么什么.o,再用哪几个文件编译出一个.o,再怎么怎么一连接,最后得到编译好的二进制程序。make就根据这份文件来指导gcc他们进行施工。当有某个.c文件被后改之后,make能够根据文件的修改时间智能的判断出哪些模块需要重新编译,重新连接,然后就去让gcc重新编译那些改过的文件,最终生成新的二进制程序。有了make和Makefile,就省去了主人敲一大堆编译命令的烦恼,只要敲一个make,其他的,就交给make去做吧,他办事,你放心。