嵌入式系统原理与技术课件:makefile的编写.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《嵌入式系统原理与技术课件:makefile的编写.ppt》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 原理 技术 课件 makefile 编写
- 资源描述:
-
1、Makefile编写目的:掌握 make 的基本语法,使用make编译程序。8.1.1Make 概述w makefile定义整个工程的编译规则w一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。w 自动化编译 w只需要一个make命令,整个工程完全自动编译 ;wmake是一个命令工具,是一个解释makefile中指令的命令工具;一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C+的nmake,Linux下GNU的
2、make。可见,makefile都成为了一种在工程方面的编译方法。Makefile里主要有什么w 显式规则、隐晦规则、变量定义、文件指示和注释。w w1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。w w2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。w w3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的
3、引用位置上。w w4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。w w5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。8.1.2关于程序的编译和链接 w 无论是C、C+,首先要把源文件编译成中间代码文件,在Windows下是 .obj
4、 文件,UNIX下是 .o 文件,即目标文件,这个动作叫做编译(compile)。w 然后再把大量的目标文件链接成执行文件,这个动作叫作链接(link)。w 编译编译时,编译器检查语法,函数与变量的声明是否正确。对于声明,通常需要你告诉编译器头文件所在的位置(头文件中应该只是声明,而定义应该放在源文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件可以生成一个中间目标文件(.o文件或是.obj文件)。关于程序的编译和链接 w 链接链接时,主要是找到函数和全局变量的定义。w 链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File)。在大多数时候
5、,由于源文件太多,编译生成的目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件 或.sow 下面是一个包含三个文件的工程8.1.3准备文件file1.c#include #include file2.hint main() printf(print file1n); File2Print(); return 0;返回返回准备文件file2.c#include file2.hvoid Fil
6、e2Print() printf(Print file2n);返回返回准备文件file2.h#ifndef FILE2_H_#define FILE2_H_#includevoid File2Print();#endif返回返回8.1.4Makefile里的主要规则target . : prerequisites .command.1.target是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(伪目标) 。2.prerequisites是要生成那个target所需要的文件或是目标。mand也就是make需要执行的命令。(任意的Shell命令)文件的依赖关系,也
7、就是说,target是需要生成的一个或多个文件,它们依赖于 prerequisites.中列出的文件,通过执行command来生成target.。一个规则可以有多个命令行,每一条命令占一行。 注意:每一个命令行必须以Tab字符开始,Tab字符告诉 make 此行是一个命令行。make按照命令完成相应的动作。这也是书写 Makefile 中容易产生,而且比较隐蔽的错误。这就是Makefile的规则,也是Makefile中最核心的内容。helloworld:file1.o file2.ogcc file1.o file2.o -o helloworldfile1.o:file1.c file2.h
8、gcc -c file1.c -o file1.ofile2.o:file2.c file2.hgcc -c file2.c -o file2.oclean:rm -rf *.o helloworld编写Makefile文件详细解读Makefile文件helloworld : file1.o file2.ogcc file1.o file2.o -o helloworld helloworld依赖file1.o file2.o两个文件编译出helloworld可执行文件。-o表示指定 的目标文件名。 若file1.o和file2.o都存在,但是其中一个比helloworld新或hellowor
9、ld不存在时,执行下面的gcc命令。 若file1.o和file2.o有任意一个不存在,假设是file1.o,会先找到file1.o的生成关系,生成file1.o后,再执行下面的gcc命令。详细解读Makefile文件(续)file1.o : file1.c file2.hgcc -c file1.c -o file1.o file1.o依赖file1.c 和file2.h这两个文件,编译出file1.o文件。 若依赖文件中有任意一个文件不存在或比file1.o新,都会重新执行下面的gcc命令。 -c表示gcc 只把给它的文件编译成.o文件,用源码文件的文件名命名但把其后缀由“.c” 变成“.
10、o”。在这句中,可以省略-o file1.o,编译器默认生成file1.o文件,这就是-c的作用。file2.o : file2.c file2.h gcc -c file2.c -o file2.o这两句的功能同上。返回返回详细解读Makefile文件(续)clean: rm -rf *.o helloworld#当用户输入make clean命令时,会执行rm指令,其功能是删除*.o 和helloworld文 件。 写好Makefile文件,在命令行中直接键入make命令,就会执行Makefile中的内容了 返回返回w 假设一个工程有3个头文件,和8个源文件,我们按照那三个规则写出的mak
11、efile应该是下面的这个样子的。w w edit :main.o kbd.o command.o display.o w insert.o search.o files.o utils.ow cc -o edit main.o kbd.o command.o display.o w insert.o search.o files.o utils.ow main.o : main.c defs.hw cc -c main.cw kbd.o : kbd.c defs.h command.hw cc -c kbd.cw command.o : command.c defs.h command.hw
12、 cc -c command.cw display.o : display.c defs.h buffer.hw cc -c display.cw insert.o : insert.c defs.h buffer.hw cc -c insert.cw search.o : search.c defs.h buffer.hw cc -c search.cw files.o : files.c defs.h buffer.h command.hw cc -c files.cw utils.o : utils.c defs.hw cc -c utils.cw clean :w rm edit ma
13、in.o kbd.o command.o display.o w insert.o search.o files.o utils.ow 在这个makefile中,w 目标文件(target)包含:执行文件edit和中间目标文件(*.o)。依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。w 每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。w 依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。 make如何工作在默认的方式下,也就是我们只输入make命令。那么:w 1、make会在当前
14、目录下找名字叫“Makefile”或“makefile”的文件。w 2、默认的情况下,make执行的是Makefile中的第一个规则。此规则的第一个目标称之为“最终目的”或者“终极目标”。在上面的例子中,它会找文件中的第一个目标文件(target),即“edit”这个文件,并把这个文件作为最终的目标文件。w 3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。w 4、如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为该.o文件的依赖规则,如果找到则再根据那一个规则生
15、成.o文件。(这有点像一个栈的过程)w 5、前提你的.c文件和.h文件是存在make如何工作w 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。w 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。w 通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令“make clean”,以此来清除所有的目标文件,以便重编译。 使用变量w 取得变量
16、值的方式:$(变量名)或 $变量名 w 定义变量w =n使用时展开w :=n定义时即展开(只能使用已经定义好的变量)w +=n变量追加w ?=n若未定义则定义,若已定义则不执行此定义w 例如:例如:w objects = main.o kbd.o command.o display.o w insert.o search.o files.o utils.ow 于是,我们就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了变量基础w objects = program.o foo.o utils.ow program : $(objects)w cc -o p
17、rogram $(objects) 或者:cc $ -o $ $和$属于自动化变量 $ 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,$就是匹配于目标中模式定义的集合。这里是 program$所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。 这里是$(objects)w $(objects) : defs.h 变量会在使用它的地方精确地展开,就像C/C+中的宏一样Makefile里使用变量OBJS = file1.o file2.oCC = gccCFLAGS = -Wall -O g-Wall:输出所有的警告信息;-
18、O:在编译时进行优化;-g:表示编译debug版本。helloworld : $(OBJS)$(CC) $(OBJS) -o helloworldfile1.o : file1.c file2.h$(CC) $(CFLAGS) -c file1.c -o file1.ofile2.o : file2.c file2.h$(CC) $(CFLAGS) -c file2.c -o file2.oclean:rm -rf *.o helloworld返回返回自动推导-隐晦规则?w GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个.o文件后都写上类似的命
19、令,因为,我们的make会自动识别,并自己推导命令。w w 只要make看到一个.o文件,它就会自动的把.c文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 gcc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。自动推导-隐晦规则?前面的makefile可以这么写:w objects = main.o kbd.o command.o display.o w insert.o search.o files.o utils.ow e
展开阅读全文