教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 求职职场 >

《深入BREW开发》分章节版 第4章 工程管理(Make File)基础

来源:网络收集 时间:2026-08-24
导读: 《深入BREW开发》分章节版 版权所有,未经本作者同意不得转载,否则视为侵权行为,保留追究责任的权力。 第四章 工程管理(Make File)基础 什么是Make File?很多Windows的程序员都不知道这个东西,因为那些Windows的IDE都为我们做了这个工作,但我觉得要成

《深入BREW开发》分章节版

版权所有,未经本作者同意不得转载,否则视为侵权行为,保留追究责任的权力。

第四章 工程管理(Make File)基础

什么是Make File?很多Windows的程序员都不知道这个东西,因为那些Windows的IDE都为我们做了这个工作,但我觉得要成为一名专业的程序员Make File还是要懂。这就好像是我现在懂了C语言,但是我还要去了解编译器的―内幕‖一样。Make File关系到了整个工程的编译规则。对于一个大型的工程来说,其中的源文件不计其数,并分别按类型、功能、模块分别放在若干个目录中,这就需要我们能够有一套方便好用的工具来管理这些源文件的编译和链接。因为,如果每次都将全部的文件编译一遍,可能会大大的浪费开发时间,所以能够识别哪些文件需要重新编译的功能就很有必要了。幸好我们有Make File来帮助我们做这些,不然真是麻烦大了。

Make File定义了一系列的规则来指定哪些文件需要重新编译,甚至于进行更复杂的功能操作。Make File带来的好处就是——―自动化编译‖,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释Make File中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下的GNU make等。可以看出,Make File已经是大多数工程管理的标准工具了。

4.1 Make File核心原理

要掌握一个东西,就应该首先掌握它的核心思想,因此在这里我们将首先来看看Make File的核心原理——依赖规则。看下面:

target ... : prerequisites ...

command

...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的―伪目标‖中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。或者理解为,生成target需要prerequisites。 command也就是make需要执行的命令。

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件更新的话,command所定义的命令就会被执行。这就是Make File的规则,也就是Make File中最为核心的原理。

完成一个简单的演示例子,在这个例子中有main.c和command.c两个源文件,一个defs.h头文件,main.c和command.c中都包含defs.h头文件。要求能够输出main.o和command.o两个目标文件。定义的Make规则如下:

《深入BREW开发》分章节版

反斜杠(\)是换行的意思,告诉Make程序下面一行于这一行紧接着。clean是用来清除生成的main.o和command.o文件。请注意,在上面的每一行缩进中,Make要求必须使用Tab键,不能使用空格做为缩进量。

在这个例子中,目标文件(target)包含目标文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是目标文件edit的依赖文件。依赖关系本质上就是说明了目标文件是由哪些文件生成的。

在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键做为开头。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。

这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的标签(Label)一样。clean的冒号后什么也没有,因此make不会自动去查找clean的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个标签(Label)的名字。这样的方法非常有用,我们可以在一个Make File中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

4.2 Make的工作方式

在默认的方式下,我们只输入make命令,或者使用-f参数指定需要执行的Make File文件,然后make程序会进行如下操作:

1、make会在当前目录下找名字叫―Makefile‖或―makefile‖的文件(注意没有扩展名)或通过-f指定的Make File文件。

《深入BREW开发》分章节版

2、如果找到Make File文件,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到―edit‖这个文件,并把这个文件做为最终的目标文件。

3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。

4、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)

5、最后当然是C文件和H文件都存在的啦,于是make会生成 .o文件,然后再用.o文件生成make的终极任务——目标文件edit了。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。如果在找寻的过程中出现错误,比如最后被依赖的文件找不到,那么make就会直接退出并报错;而对于所定义命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要求make执行。即命令——―make clean‖,以此来清除所有的目标文件,以便于重新编译。于是在上面的例子中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如main.c,那么根据我们的依赖性,我们的目标main.o会被重编译(也就是在这个依性关系后面所定义的命令),于是main.o的文件也是最新的啦,于是main.o的文件修改时间要比edit要新,所以edit也会被重新生成了(详见edit目标文件后定义的命令)。而如果我们改变了―defs.h‖,那么,main.o和command.o都会被重新编译,那么理所当然的,edit也会被重生成。

为了更加清晰的理清Make File的工作方式,现在我们总结一下Make File的各个工作阶段及其执行的内容:

1、读入所有的Makefile

2、读入被include的其它Makefile

3、初始化文件中的变量

4、分析所有规则

5、为所有的目标文件创建依赖关系链

6、根据依赖关系,决定哪些目标要重新生成

7、执行生成命令

1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。

《深入BREW开发》分章节版

4.3 Make File实例

或许您会觉得上面的例子也太简单了,根本不值一提。那么现在就来一个高阶的应用来看看。还记得我们在编译器基础一节所作的Test4例子吗,我们就在这个例子中添加一个makefile 文件(注意没有扩展名)。

《深入BR …… 此处隐藏:12656字,全部文档内容请下载后查看。喜欢就下载吧 ……

《深入BREW开发》分章节版 第4章 工程管理(Make File)基础.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1702341.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)