Linux基础6-Makefile.ppt_第1页
Linux基础6-Makefile.ppt_第2页
Linux基础6-Makefile.ppt_第3页
Linux基础6-Makefile.ppt_第4页
Linux基础6-Makefile.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LINUX基础-Makefile,什么是Makefile 1,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile 就像一个Shell 脚本一样,其中也可以执行操作系统的命令。 makefile 带来的好处“自动化编译”,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make 是一个解释makefile 中指令的命令工具,一般来说,大多数的IDE 都有这个命令,比如:Delphi 的make,Visual C+的nmake,Linux 下GNU 的ma

2、ke,什么是Makefile2,大多数的Winodws 的程序员可能不需要深入了解Makefile,因为Windows 的IDE 已经做了相关的工作 要作一个好的和professional 的程序员,makefile 还是要懂。一方面可以组织与实现大型开发工程,另一方面,至少可以在已有工作基础上添加或修改相关内容。 特别在Unix /Linux下的软件编译,就不能不自己写或修改makefile了;会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力,Makefile文件的名字1,缺省情况下,make 命令以下列名字查找makefile文件:“GNUmakefile”,“m

3、akefile” 和“Makefile”(注意大小写)。 通常makefile 应叫做“makefile”或“Makefile”。不推荐“GNUmakefile”,除非makefile 是为GNU 的make 定制的,其它的make 不认为该名字是一个makefile 的名字。,Makefile文件的名字2,如果使用非标准命名的makefile,必须用命令开关“-f” 或 “-file”。参数 “-f NAME” 或 “-file NAME”告诉make 读入NAME 作为makefile 如果使用多个该开关,所有的文件将按顺序连接起来,同时不会自动检测标准的makefile 名字,例子,一个

4、简单makefile例子,描述如何编译链接由3个C文件组成的一个编译器:,Makefile的组成1,Makefile 里主要包含了五种类型的语句/行:显式规则、隐式规则、变量定义、文件指示和注释 显式规则: 显式规则说明了如何生成一个或多的的目标文件。这是由Makefile 的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令 隐式规则: 由于我们的make 有自动推导的功能,所以隐式的规则可以让程序员比较简略地书写Makefile,这是由make 所支持的,Makefile的组成2,变量的定义: 在Makefile 中可定义一系列的变量,变量一般都是字符串,有点象C 语言中的宏,当Ma

5、kefile被执行时,其中的变量都会被扩展到相应的引用位置上 文件指示:其包括了三个部分,(1)在一个Makefile 中引用另一个Makefile,就像C 语言中的include 一样;(2)根据某些情况指定Makefile 中的有效部分,就像C 语言中的预编译#if 一样;(3)定义一个多行的命令。,Makefile的组成3,注释: Makefile 中只有行注释,和UNIX/Linux 的Shell 脚本一样,其注释是用“#”字符,作用与C/C+中的“/”一样 如果你要在你的Makefile 中使用“#”字符,可以用反斜框进行转义,如:“#” 注意:在Makefile 中的命令,必须要以

6、Tab键开始,Makefile的规则1,规则解释如何和何时重做该规则中的文件,make 根据依赖关系执行产生或更新目标;规则也说明如何和何时执行动作。有的规则看起来很复杂,但都符合下述模式。 makefile 中的规则样式如下: TARGET : DEPENDENCIES COMMAND1 COMMAND2 目标(TARGET)是程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。,Makefile的规则2,依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件 命令(COMMAND)是make 执行的动作,一个可以有多个命令,每个

7、占一行 注意:每个命令行的起始字符必须为TAB 字符,不是空格! 有依赖关系规则中的命令通常在依赖文件变化时负责产生target 文件,make执行这些命令更新或产生target。规则可以没有依赖关系,如包含target “clean”的规则,make的工作原理1,当执行make 的时候,make 程序从当前目录读入makefile 开始处理第一个规则 make缺省从第一个target 开始(第一个非 “.” 开始的target),这称作缺省目标。在上述的makefile 中,缺省目标是更新执行程序“LIB”,将这个目标置于最前面。 在make 处理这个规则之前,必须处理“LIB所依赖的那些文

8、件的规则,例子中是目标文件。,make的工作原理2,这些文件按照他们自己的规则处理:通过编译源文件来更新每个“.o” 文件;当依赖关系中的源文件或头文件比目标文件新,或目标文件不存在时,必须重新编译。 和目标没有依赖关系的规则不会被处理,除非指定make 处理(如make clean)。 在重新编译目标文件之前,make 会试图更新它的依赖:源文件和头文件。例子中的makefile 对源文件和头文件未指定任何操作:.c和.h文件不是任何规则的目标。,make的工作原理3,确认所有的目标文件都是最新的之后,make 决定是否重新链接“LIB:如果LIB不存在,或者任何一个目标文件都比它新,则链接

9、工作将进行。 如果改变fun1.c ,make 会编译这个文件来更新“fun1.o,然后链接“LIB;,命令简化1,不必为每个文件写出编译命令的,make 可以自己来做;以.c文件更新.o文件有一个隐含的规则,使用cc -c命令。Make 将利用cc -c main.c -o main.o来将main.c 编译为main.o,因此在生成目标文件的规则中,可以省略命令。 当“.c”文件以这样的方式使用时,将自动加入到依赖关系中;由是在省略命令的前提下,可以将“.c”文件从依赖关系中省略。 以下是简化过的makefile:,简化命令2,变量的定义与使用,这样的重复容易出错:假设工程中加入了一个新的

10、目标文件,可能只将其加入了一个列表中;通过使用变量可以消除这种风险:变量允许一个预定义的字符串在多个地方被替换 在makefile 中,可以写这样一行来定义object变量: objects = fun1.o fun2.o fun3.o 在需要目标文件名列表的地方,可以使用$(object) 来代替变量的值 如果要使用真实的“$”字符,那么你需要用“$”来表示,变量的定义与使用,Makefile调用系统命令,在调用的命令前加符号即可 如pwd echo “ hello world”,变量中的变量,定义变量的值时,可以使用其它变量来构造变量的值,在Makefile中有几种方式来在用变量定义变量的

11、值。 先看第一种方式,也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值。如: foo = $(bar) bar = $(ugh) ugh = Huh,变量值的替换,也可以替换变量中的共有的部分,其格式是“$(var:a=b)”或是“$var:a=b”,其意思是,把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。 foo := fun1.o fun2.o fun3.o bar := $(foo:.o=.c) 这个

12、示例中,先定义了一个“$(foo)”变量,而第二行的意思是把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”的值就是fun1.c fun2.c fun3.c”。,追加变量值,可以使用“+=”操作符给变量追加值,如: objects = fun1.o, fun2.o objects += fun3.o objects值变成:“fun1.o fun2.o fun3.o”(fun3.o被追加进去了),系统环境变量,系统环境变量可以在make开始运行时被载入到Makefile文件中,但是如果Makefile中已定义了这个变量,或是这个变量由make命令行带入,

13、系统的环境变量的值将被覆盖 如果在环境变量中设置了“CFLAGS”环境变量,那么我们就可以在所有的Makefile中使用这个变量了。这对于使用统一的编译参数有比较大的好处。 如果Makefile中定义了CFLAGS,则会使用Makefile中的这个变量,如果没有定义,则使用系统环境变量的值,一个共性和个性的统一,很像“全局变量”和“局部变量”的特性,在规则中使用通配符,如果想定义一系列比较类似的文件,很自然地就想起使用通配符。 make支持三各通配符:“*”,“?” 。这是和Unix的B-Shell是相同的。 波浪号“”字符在文件名中也有比较特殊的用途。如果是“/test”,这就表示当前用户的

14、$HOME目录下的test目录。 如果文件名中有通配符,如:“*”,那么可以用转义字符“”,如“*”来表示真实的“*”字符,而不是任意长度的字符串,目录搜索,在一些大的工程中,有大量的源文件,通常的做法是把这许多的源文件分类,并存放在不同的目录中。所以,当make需要去找寻文件的依赖关系时,可以在文件前加上路径,但最好的方法是把一个路径告诉make,让make 在自动去找。 Makefile 文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make 只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make 就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了 VPATH = src:./headers,目录搜索2,上面的的定义指定两个目录,“src”和“./headers”,make 会按照这个顺序进行搜索。目录由“冒号”分隔。(当前目录是最高优先搜索的地方) 在当前目录创建src目录,将所有的.c文件都移动到src目录中,多目标1,Makefile的规则中的目标可以不止一个,其支持多目标,有可能多个目标同时依赖于一个文件,并且其生成的命令大体类似。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论