Makefile---简介

来源:互联网 发布:淘宝上怎么添加旺旺 编辑:程序博客网 时间:2024/06/03 06:11

从今天开始,进行makefile系列的归纳总结,目的是为了更好的理解编译脚本的执行原理以及今后在Android编译时更清楚的理解其编译过程。

Android系统毫无疑问是一个非常庞大且复杂的系统,若每一次进行修改后,都要一个个文件去编译,解释生成可执行文件,未免太浪费开发效率。谷歌的大牛自然也想到了这点,所以引入了makefile机制。什么是makefile呢,中文直译的话可理解为:编译文件。顾名思义,它是为了对源码进行编译而诞生的,但是Android的编译不是由Android虚拟机去解决的吗?没错,但是Android虚拟机需要知道,该编译哪些文件且是按照怎样的规则去编译源代码,makefile就很好的解决了这部分需求。它使得庞大的Android系统,只需要你敲一个"make"命令,就只需边喝咖啡边刷电视剧慢慢等待就好了。

虽然,谷歌大牛们已经为我们写好了makefile了,但是我们也应该做适度的了解,尤其是当自己新添加文件时,可能涉及到自己需实现自己的makefile文件,并加入到Android大家庭中。

由上可知,makefile文件就是为了解决从源码生成可执行文件这一过程的。那么它到底做了啥,就实现了这么大的工作量呢?首先得了解一个程序从源码到可执行文件它需要经历的过程。(有过编译原理学习的朋友就可直接跳过)

对于早期的C/C++来说,当我们写完了一份代码,如经典的打印"Hello World!",当我们用IDE点击编译运行的时候,就在控制台看到了"Hello world!"第一次看确实觉得有点神奇,就不禁想问,它悄悄在后面干了些啥见不得人的勾当呢?其实也没干啥不好意思的,首先它需要对源码进行初步的检查,如语法,变量的声明等。确保你的代码没违反它制定的规则,它是谁呢?它就是编译器,这个检查过程也叫做编译,对于C/C++用的比较多的就是gcc了,它会制定一些基本规则,你若想让你的代码在它上面跑起来,就不能违背它的规则,有点霸道哈。这个过程会孕育一个新的产物,叫中间目标文件,为啥叫中间呢,因为好戏还在后头。我们知道计算机只认识0,1二进制,所以要想让计算机这个阿斗知道我们想让它干啥,还必须转换成它会的语言才行,所以得到中间目标文件后,还要让这些文件转变成机器码,这个过程就是链接了。将各个中间目标文件链接成最终的可执行文件,计算机就能按我们的指示跑起来了。

总而言之,makefile就是为了免去我们去操作编译和链接这两个过程。让我们可以一键生成可执行文件。

那么谷歌大牛把makefile拉过来,它又是咋服务的呢?它需要满足三个基本原则:

① 若源文件及引入的库都未编译的话,则全部编译。

② 若部分源文件改动的话,只编译改动的文件。

③ 若依赖的库发生变化,则所有依赖该库的文件都要重新编译。

基本上,makefile都需要满足上述的三个基本要求,其实makefile就是一个规则制定者,它告诉系统这些文件该按照怎样的依赖关系,怎样的顺序进行编译和链接。系统就会按照它制定的规则去操作这些文件。看来它权力还挺大。这也是makefile的核心,对后续的学习有着重要的指导性作用。就把它当做makefile的信仰吧,它在这方面可是非常虔诚的。

makefile中包含了许多规则,但基本格式如下:

target:file1,file2

command...

其中,target是我们要生成的目标文件,可以是中间目标文件,也可以是最终的可执行文件。

file1,file2就是生成目标所需要的依赖文件。就像做一道菜,你需要指定的材料一样。

command就是一串将file1,file2生成target的操作步骤,注意前面需要以TAB键开头。好比做菜,你有了材料,总不能直接端上桌吧,这一定会得差评,所以需要通过一系列制定的操作,蒸、炸、炒等做成最终的成品,才能给顾客享用,这样才能得好评哦。(小编是个吃货。。。)

但是,在makefile中,为了实现良好的自动化操作,并节省码农们的精力,也有很多隐晦规则,以及变量等的使用。但上述的规则格式才是核心部分,并且,既然是代码,则应该讲究易读性强的原则,否则,苦的可是自己。

说了这么多,不如上个例子,作为今天的结尾吧,谁让咱是实干家呢。

原创粉丝点击