makefile简介

上传人:第*** 文档编号:32689591 上传时间:2018-02-12 格式:DOC 页数:6 大小:82.50KB
返回 下载 相关 举报
makefile简介_第1页
第1页 / 共6页
makefile简介_第2页
第2页 / 共6页
makefile简介_第3页
第3页 / 共6页
makefile简介_第4页
第4页 / 共6页
makefile简介_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《makefile简介》由会员分享,可在线阅读,更多相关《makefile简介(6页珍藏版)》请在金锄头文库上搜索。

1、Dept:AP 产品部Auth: 刘艳波 2018-2-5第 1 页 总 6 页GNU Makefile 简介1. 基本 makefile 结构GNU Make 的主要工作是读进一个文本文件:makefile。这个文件里主要是有关哪些文件(target目的文件)是从哪些别的文件(dependencies依靠文件)中产生的,用什么命令来进行这个产生过程。有了这些信息,make 会检查硬盘上的文件,如果目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依靠文件旧的话,make 就执行相应的命令,以便更新目的文件。 (目的文件不一定是最后的可执行文件,它可以是任何一个文件,甚至是一个不存在

2、的文件)makefile 一般被叫做 “makefile”或“Makefile” 。当然也可以在 make 的命令行通过-f 参数指定别的文件名。如果不特别指定,它会寻找当前目录下的“makefile ”或“Makefile ”文件,因此使用这两个名字是最简单的。一个 makefile 主要含有一系列的规则,如下:: (tab)(tab)例如,考虑以下的 makefile 文件:这是一个非常基本的 makefile。make 从最上面开始,把上面第一个目的:myprog,做为它的主要目标(一个它需要保证其总是最新的最终目标) 。给出的规则说明只要文件myprog比文件foo.o或bar.o中的

3、任何一个旧,下一行的命令将会被执行。但是,在检查文件 foo.o 和 bar.o 的时间戳之前,它会往下查找那些把 foo.o 或 bar.o 做为目标文件的规则。它找到的关于 foo.o 的规则,该文件的依靠文件是 foo.c, foo.h 和 bar.h 。它从下面再找不到生成这些依靠文件的规则,它就开始检查磁碟上这些依靠文件的时间戳。如果这些文件中任何一个的时间戳比 foo.o 的新,命令gcc -o foo.o foo.c将会执行,从而更新文件 foo.o 。接下来对文件 bar.o 做类似的检查,依靠文件在这里是文件 bar.c 和 bar.h 。现在,make 回到 myprog的

4、规则。如果刚才两个规则中的任何一个被执行,Dept:AP 产品部Auth: 刘艳波 2018-2-5第 2 页 总 6 页myprog 就需要重建(因为其中一个 .o 就会比 myprog新) ,因此连接命令将被执行。到此,可以看出使用 make 工具来建立程序的好处 源码文件里一个简单改变都会造成那个文件被重新编译(因为.o 文件依靠.c 文件) ,进而可执行文件被重新连接(因为 .o 文件被改变了) 。其实真正的得益是在当改变一个 header 文件的时候我们不再需要记住那个源码文件依靠它,因为所有的信息都在 makefile 里。make 会很轻松的替我们重新编译所有那些因依靠这个 he

5、ader 文件而改变了的源码文件,如有需要,再进行重新连接。2. 编写 make 规则 (Rules)最明显的编写规则的方法是一个一个的查看源码文件,把它们的目标文件做为目的,而源码文件和被它#include 的 header 文件做为依靠文件。但是也要把其它被这些header 文件#include 的 header 文件也列为依靠文件,还有那些被包括的文件所包括的文件然后你会发现要对越来越多的文件进行管理,然后你的头发开始脱落,你的脾气开始变坏,你的脸色变成菜色,你走在路上开始跟电线杆子碰撞,终于你捣毁你的电脑显示器,停止编程。到低有没有些容易点儿的方法呢?当然有!向编译器要!在编译每一个源

6、码文件的时候,编译器实在应该知道应该包括什么样的 header 文件。使用 gcc 的时候,用-M 开关,它会为每一个指定的文件输出一个规则,把目标文件做为目的,而这个文件和所有应该被#include 的 header 文件将做为依靠文件。注意这个规则会加入所有 header 文件,包括被角括号()和双引号() 所包围的文件。其实我们可以相当肯定系统 header 文件(比如 stdio.h, stdlib.h 等等)不会被我们更改,如果用-MM 来代替 -M 传递给 gcc,那些用角括号包围的 header 文件将不会被包括。 (这会节省一些编译时间) 。由 gcc 输出的规则不会含有命令部

7、分;可以自己写入我们需要的命令或者也可以什么也不写,而让 make 使用它的隐含的规则。3. Makefile 变量上面提到 makefiles 里主要包含一些规则。它们包含的其它的东西是变量定义。makefile 里的变量就像一个环境变量(environment variable)。事实上,环境变量在 make 过程中被解释成 make 的变量。这些变量是大小写敏感的,一般使用大写字母。它们可以从几乎任何地方被引用,也可以被用来做很多事情,比如:1. 贮存一个文件名列表。在上面的例子里,生成可执行文件的规则包含一些目标文件名做为依靠。在这个规则的命令行里同样的那些文件被输送给 gcc 做为命

8、令参数。如果在这里使用一个变量来贮存所有的目标文件名,加入新的目标文件会变的简单而且较不易出错。2. 贮存可执行文件名。如果项目被用在一个非 gcc 的系统里,或者如果想使用一个不同的编译器,必须将所有使用编译器的地方改成用新的编译器名。但是如果使用一个变量来代替编译器名,那么只需要改变一个地方,其它所有地方的Dept:AP 产品部Auth: 刘艳波 2018-2-5第 3 页 总 6 页命令名就都改变了。3. 贮存编译器 flags。假设想给你所有的编译命令传递一组相同的选项(例如 -Wall -O -g) ;如果把这组选项存入一个变量,那么可以把这个变量放在所有呼叫编译器的地方。而当要改变

9、选项的时候,只需在一个地方改变这个变量的内容。要设定一个变量,只要在一行的开始写下这个变量的名字,后面跟一个=号,后面跟要设定的这个变量的值。以后要引用这个变量,写一个$符号,后面是围在括号里的变量名。比如在下面,我们把前面的 makefile 利用变量重写一遍:还有一些设定好的内部变量,它们根据每一个规则内容定义。三个比较有用的变量是 $, $ depends在这里如果一个叫depends的文件不存在,或任何一个源码文件比一个已存在的 depends 文件新,那么一个 depends 文件会被生成。depends 文件将会含有由 gcc 产生的关于源码文件的规则(注意-M 开关) 。现在我们要让 make 把这些规则当做makefile 档的一部分。这里使用的技巧很像 C 语言中的 #include 系统我们要求make 把这个文件 include 到 makefile 里,如下:include dependsGNU Make 看到这个,检查depends目的是否更新了,如果没有,它用我们给它的命令重新产生 depends 档。然后它会把这组(新)规则包含进来,继续处理最终目标 myprog 。当看到有关 myprog 的规则,它会检查所有的目标文件是否更新 利用 depends 文件 里的规则,当然这些规则现在已经是更新过的了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号