《make及makefile文件的编写培训课程.ppt》由会员分享,可在线阅读,更多相关《make及makefile文件的编写培训课程.ppt(86页珍藏版)》请在金锄头文库上搜索。
1、第5章 Make及makefile文件的编写,1.概述,2. Makefile,3.Makefile的规则,4. 规则的命令,5.Makefile中的变量,6.执行make,Linux系统下的文件编译,程序的编译和链接,源程序(.c),编译(compile),链接(linker),形成目标文件,形成可执行程序,(1)预编译 (2)汇编阶段,什么是make?,Make是大型程序维护工具 Make工作时,需要名字为“makefile”的makefile文件。 根据依赖关系自动决定项目的那些部分需要重新编译。 基本原理:如果某个源程序文件被修改,那么依赖这个源程序文件的所有目标文件,都需要重新编译。
2、,Makefile Rule,Rule的格式为: target : prerequisites command Target 依赖prerequisites的目标 Prerequisites 被依赖的源程序,例如c文件或h文件 Command需要执行的命令 当prerequisites任何一个文件的时戳新于target的时戳时,就执行command。,makefile规则介绍,一个简单的Makefile描述规则组成: TARGET. : PREREQUISITES. COMMAND .,-target:规则的目标。 -通常是程序中间文件(.o)或者最后可执行文件名 -目标也可以是一个make执
3、行的动作的名称,如目标“clean”,这样的目标是“伪目标,-prerequisites:规则的依赖。 -生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。,-command:规则的命令行 -是 make程序所有执行的动作(任意的 shell 命令或者可在 shell下执行的程序) -一个规则可以有多个命令行,每一条命令占一行。注意:每一个命令行必须以Tab字符开始,makefile文件,在makefile(Makefile)文件中,采用自顶向下到的方法来说明依赖关系 network:network.o subrs.o (1) gcc network.o subrs.o o
4、network (2) network.o:network.c netdefs.h (3) gcc c network.c -o network.o (4) subrs.o: subrs.c netdefs.h (5) gcc c subrs.c .PHONY clean clean: rm -r *.o (6),执行make,在makefile(Makefile)文件所在的目录中,执行make命令 语法:make 选项 宏定义 目标文件,Make的工作过程,1.make在当前目录下找名字叫“Makefile”或“makefile”的文件 2.如果找到,它会找文件中的第一个目标文件(targe
5、t),比如找到“network”这个文件,并把这个文件作为最终的目标文件。 3.如果network文件不存在,或是network所依赖的后面的 .o 文件的文件修改时间要比network这个文件新,那么,他就会执行后面所定义的命令来生成network这个文件。 4.如果network所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件(使用源文件和.h文件)。(这有点像一个堆栈的过程),make时,哪些文件被重新编译,1. 所有的源文件没有被编译过,则对各个 C源文件进行编译并进行链接,生成最后的可执行程序; 2. 每一个在上次执行
6、make之后修改过的C源代码文件在本 make时将会被重新编译; 3. 头文件在上一次执行 make 之后被修改。则所有包含此头文件的 C 源文件在本次执行make 时将会被重新编译。,关于Makefile文件名,默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。 也可以使用别的文件名来书写Makefile,这是执行Make命令时,需使用“-f”和“-file”参数。如:make -f Make.Linux或make -file Make.AIX,对“规则”的再认识,在 Makefile
7、中“规则”就是描述在什么情况下、如何重建规则的目标文件, 通常规则中包括了目标的依赖关系(目标的依赖文件)和重建目标的命令。 make执行重建目标的命令,来创建或者重建规则的目标(此目标文件也可以是触发这个规则的上一个规则中的依赖文件)。 规则包含了目标和依赖的关系以及更新目标所要求的命令。,一个简单的例子,1.注释以#开头 2.一个较长行可以使用反斜线()分解为多行,后不能有空格 3.目标“clean”不是一个文件,它仅仅代表了执行一个动作的标识。 Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标” 在执行make时,它所指定的动作不会被执行。除非执行make时明确地指定它
8、作为重建目标。而且目标“clean”没有任何依赖文件,它只有一个目的,就是通过这个目标名来执行它所定义的命令。Makefile中把执行“clean”目标所定义的命令,可在shell下输入:make clean。,使用变量,在上例的 Makefile中可是添加这样一行: objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o “objects”作为一个变量,它代表所有的.o文件的列表,在需要使用这些.o文件列表的地方使用“$(objects)”来表示它 objects = main.o kbd.o
9、command.o display.o insert.o search.o files.o utils.o edit : $(objects) gcc $(objects) -o edit . . clean : rm edit $(objects),使用变量的例子,exe : main.o io.o gcc main.o io.o -o exe main.o : main.c gcc -g -c main.c o main.o io.o : io.c gcc -g -c io.c -o io.o,OBJS = main.o io.o exe: $(OBJS) gcc $(OBJS) -o e
10、xe main.o : main.c CFLAGS=-g gcc $(CFLAGS) c main.c -o main.o io.o : io.c gcc $(CFLAGS) -c io.c -o io.o,自动推导规则(隐含规则),make中,编译.o文件时,make会认为其源程序就是同文件名的.c源文件,因此依赖列表中可以省略.c文件,这是make的隐含规则 书写 Makefile时,对于一个.c 文件如果使用 make的隐含规则,那么它会被自动作为对应.o 文件的一个依赖文件(对应是指:文件名除后缀外,其余都相同的两个文件)。因此可以在规则中省略目标的倚赖.c 文件。,清洗工作目录过程文
11、件,clean : rm edit $(objects) 一般写为: .PHONY : clean clean : -rm edit $(objects),两个实现有两点不同: 1. 通过“.PHONY”特殊目标将“clean”目标声明为伪目标。防止当磁盘上存在一个名为“clean”文件时,“clean”所在规则的命令无法执行。 2. 在命令行之前使用“-”,意思是忽略命令“rm”的执行错误,第7章 Make及makefile文件的编写,1.概述,2. Makefile,3.Makefile的规则,4. 规则的命令,5.Makefile中的变量,6.执行make,Makefile的内容,在一个
12、完整的 Makefile 中,包含了 5 个东东: 显式规则 隐含规则 变量的定义 指示符 注释,它描述了在何种情况下如何更新一个或者多个被称为目标的文件。 在书写 Makefile是需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令。,它是make根据此类目标文件的命名(典型的是文件名的后缀)而自动推导出来的规则。 make根据目标文件的名字,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。,就是使用一个字符串代表一段文本串,当定义了变量以 后,Makefile后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串的使用,指明在 make程序读取 makef
13、ile文件过程中所要执行的一个动作。包括: 1. 读取给定文件名的文件。 2.决定(通常是根据一个变量的得值)处理或忽略Makefile中的某一特定部分 3.定义一个多行变量。,Makefile 中“#”字符后的内容被作为是注释内容 注释行的结尾如果存在反斜线(),那么下一行也被作为注释行 当在 Makefile中需要使用字符“#”时,可以使用反斜线加“#”(#)来实现,makefile文件的命名,执行make命令时,默认的情况下,make 会在工作目录(执行 make 的目录)下按照文件名顺序寻找 makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefi
14、le”、“Makefile”。 通常应该使用“makefile”或者“Makefile”作为一个 makefile 的文件名,“GNUmakefile” 不推荐使用,因为以此命名的文件只有“GNU make”才可以识别。 当 makefile文件的命名不是这三个任何一个时,需要通过 make的“-f”或者“-file”选项来指定 make 读取的 makefile 文件。,包含其它的Makefile,include FILENAMES. make暂停读取当前的Makefile,转而去读取include下的Makefile,结束后,继续当前的Makefile 书写在独立的一行,不可以tab开头
15、可使用“-include”来代替“include”,忽略由于包含文件不存在或者无法创建时的错误提示(“-”的意思是告诉 make,忽略此操作的错误。make继续执行),MAKEFILES变量,如果当前环境定义了一个“MAKEFILES”的环境变量,make执行时首先将此变量的值作为需要读入的Makefile文件,多个文件之间使用空格分开。类似使用指示符“include”包含其它Makefile文件一样 变量“MAKEFILES”主要用在“make”的递归调用过程中的的通信,实际应用中很少设置此变量。,MAKEFILE_LIST变量,make程序在读取多个 makefile文件时,在对这些文件进
16、行解析执行之前,将会被自动的追加到变量“MAKEFILE_LIST”的定义域中。,make如何解析Makefile,分为两个阶段 第1阶段:读取所有的Makefile文件,内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。 第2阶段:根据第1阶段建立的目标和依赖之间的依赖关系结构链表决定哪些目标需要更新,并使用响应的规则,对该目标进行更新。 理解 make执行过程的两个阶段是很重要的。它能帮助我们更深入的了解执行过程中变量以及函数是如何被展开的。 在make的第1阶段,变量和函数被展开的,称为立即展开,否则为延后展开。,第7章 Make及makefile文件的编写,1.概述,2. Makefile,3.Makefile的规则,4. 规则的命令,5.Makefile中的变量,6.执行make,Makefile规则,