驾驭Makefile

4星(超过85%的资源)
所需积分/C币:37 2013-07-26 11:12:18 1.2MB PDF
6
收藏 收藏
举报

从事嵌入式系统开发,若不能驾驭Makefile,那将很难做到游刃有余。make程序通过读取Makefile来做相应的事。在学习了这篇教程之后,您将能够很熟练的使用Makefile
驾驭 及每种方式的运行结果。第一种方式是只要在 所在的目录卜运行命令,于是在终端 上会输出二行,第一行实际上是我们在 中所写的命令,而第二行则是运行命令的结果,你 看到我们的 确实在终端上打印了“ ,真是太棒了!第二种方式,则是运行 ”命令,这告诉工只,我要生成目标,其结果也不用多说了。第三种式则是运行 指示为我们生成标。由于我们根本没有定义目标,所以运行结果是可想而知的, 的确报告了不能找到目标。 图 的套果 现在,我们对图的 做一点小小的改动,如亲。其中的改动就是增加了 规则用于构建标——在终端上打印出“ 图是图 的运行綪果。从目前这两个 的运行结果中我们学到了什么 呢?我想有如下儿点: 个 中可以定义多个目标。 调用 命令时◆我们得告诉它我们的目标是什么,即要它干什么。当没有指明具体的 目标是什么那么以 文件中定义的第一个目标作为这次运行的目标。这 “第《个”每标也称之为默认目标。 得到目标后,先找到定义目标的规则,然后运行规则中的命令来达到构建目标的 的。现在所示例的 中,每一个规则中都只有一条命令,而实际的 每 规则可以包含很多条命令。 图 对于前面的示例我们看到当运行时,在终端上还打印出了 文件中的命令。有时, 驾 我们并不希望它这样,因为这样可能使得输出的信息看起来有些混乱。要使 不打印出命令, 只要做一点小小的修改就行了,改过的 如图所示,就是在命令前加了一个‘’。这 符号告诉 在运行时不要将这一行命令显示出来。更改后相应的运行结果如图所示。 图 图 至此,再在图 的基础上再做一点小小的改动,如图所示。其中的改动之一是 在各命令前增加了一个’,之二则是在目标之后的‘:’后加上了日标。老 和 命令的结果如图所示。从输出结果中,你会发现当运行 同标好象也被 构建了! 图 图 这里需要引入 命依赖关系的概念,图中目标后面的是告诉 标依赖目标,这一赖目标在 中又被称之为先决条件。出现这种目标依赖关系时, 工具会按从态到右的后顺序先构建规则中所依赖的每一个日标。如果希构建日标不,那么 会构建宝之前得先构建目标,这就是为什么我们称之为先决条件的原因。图 采用 类图表达了目标的依赖关系 test 图 目标的依赖关系 至此,我们已经认识了 中的细胞—规则,图是规则的语法表示,而图 是其文字表示。一个规则是由目标( 先决条件( )以及命令( 所组成的。需要指出的是,目标和先决条件之间衣达的就是依赖关系( ),这种依赖关 系指明在构建口标之前,必须保证先决条件先满足(或枃建)。而先决条件可以是其它的日标,当先 决条件是目标时,其必须先被构建出米。还有就是一个规则中目标可以有多个,当存在多个目标, 且这一规则是 中的第一个规则时,如果我们运行命令不带任何目标,那么规则中的 驾驭 第一个目标将被祧为是缺省目标。图是定义了两个目标的规则,而图是其运行结果。 图 图 说起来也很简单,因为其基本单元就是规则,不管多么复杂的 都是用规则 “码”出来的。当然,为了更高效的“码”出来,还得运用 所提僬的变量和函数等功能 这后面我们会慢慢的讲到。 规则的功能就是指明什么时候以及如何来为我们重新创建目确准 例了中, 不论我们在什么时候运行命令(带目标或是不带目标,其都在终端上打印出信息来,和我 们采用 进行代码编译时的表现好象有些不同。当采 來编译程序时,如果两次编译 之间没有任何代码的改动,理论上说来,我们是不希看到 会有仆么动作的,只需说“目标 是最新的”,而我们的最终目标也是希望构建出“聪明的” 的。与 相比不 同的是,采用 来进行代码编译时, 电所存在的先决条件都是具体的程序文件,后 面我们会看到。 用表示的规则的语法 规则的语法 图 采用文字进行表达的规则门语法 对于图中的规则,我们说是目标,则是目标的依赖目标,而 ”则是用」生成目标的命令。 处理一个规则的活动图如图所示,当中的构建依 赖目标( )这一活动(注意是活动,而不是动作)就是重复图所示 的同样的活动,你可以看作是对图活动图的递归调用。而运行命令构建目标( )则是一个动作,是由命令所组成的动作。活动与动作的区别是,动作是只做一件事(但 是可以有多个命令),而活动可以包括多个动作。 驾驭 图 处理规则的活动图 为了更加深刻的珂解图 的规则处理活动图,我们拿图中的 为例来说一说 是如果处理目标规则的其处理活动图如图所示,图中的左是飞规则的处理活动 图,由于规则有一个依赖日标,所以其走的是 分,调用 活动,最后,运行规则命令。图的石边则是构建目标的活动图,由于目标没有 依赖关系,所以走的是分支 图 构建目标的活动图 通过这 关 的几个例子,我们认识了 中的规则。而规则中描述了 日标是什么先决条件是什么(即依赖关系),以及生成日标所需运行的命令是什么。对于规则需要 特别注意的是,你一行命令之前必须用键。当然 的 离我们现实工作中 的 还有很大的距离,其中的距离主要体现在功能性和可使用性上。为了让 能更好 的服务手我们的开发工作,我们还得学习 中的其它的内容。无论如何, 是一个 很好的开端! 原理 接下来我们试着将规则运用到程序编译当中去,卜面我们假设有图所示的用」创建 可执行文件的两个源程序文件,就假设我们是在做项目吧!现在,我们需要写一个用于创建 可执行程序的 了,这个 需要如何去写?还记得目标、依赖关系和命令吗? 驾驭 图 项目的游程序文件 写一个 文件的第一步不是一个猛子扎进去试着写一个规则,前是先用面向依赖关系的 方法想清楚,所要写的 需要表达什么样的依赖关系,这一点非常的重要通刘不断的练习, 我们最终能达到很自然的运用依赖关系去思考问题。到那时,你在写 头脑会非常的清 楚自己在写什么,以及后面要写什么。现在抛开 我们先看一看(解序的依赖关系是 什么。 图我想是第一个跃入我们脑海中的依赖关系图,中 可执行文件显然是通过 和最后编译并连接生成的。通过这个依赖图,其实我就叫以写出一个 来了 这个任务交给读者你。这样的依赖关系所写出来的 在现实中不是很可行,就是你得将所 有的源程序都放在行中让 为我们编译。如果是这样,那我们希望什么样的依赖关系呢?让 我们想想看图 中缺了仆么。目标文件?对! main. c <<executable file>> simple foo. c 图 图 是 程序的依赖关系更为精确的表达,其中我们加入了目标文件。对于 执行程序来说图表示的就是它的“依赖树”。接下来需要做的是将其中的每一个依赖关系, 即其中的每一个带箭头的虚线,用 中的规则来表示。 <<o file>> c file maln. o maln. c <≤ executab| e file>> nple <<o file>> <<.c file>> f 图 程序的精细依赖关系 有了“依赖树”,写 就会相对的轻松了。图是图所对应的 而图 则是依赖关系与规则的映射图。在这个 中,我还增加了一个 目标用于删除所生成的 文件,包括目标文件和 可执行程序,这在现实的项目中很是常见。值得一提的是规则 驾驭 中的 如果在主机上,其应当就是,这里用 是因为我是在 环境中的原由,因为在 环境中,一个可执行文件仍然是遵照 操作系统的规则而多 生成一个后缀 图 d main. o foo. o main.o:main. c gcc-o simple main. o foo.o gcc-C maIn c-o maIn.o ≤< o file> <s c file>> main. o man. c <<executable file>> simple << o file>> <≤. c file>> too, o too.c foo, o: foo. c gcc-c foo c-o foo.o 图给出了 程序的泽、执行以及清除的运行结果。就这么简单?当然!不过需要 指出的是,这种方与真正的人型项目所需要的还相差很远,慢慢来,我们已经迈出了很重要的 步 如果我们在不改变代码的清况下再编泽会出现什么现象呢?图给出了结果,注意到了第 二次编译并没有构建目标文件的动作吗?但为什么有构建 叫执行程序的动作呢?为了明白为 什么,我们需要了解 是如何决定哪些日标(这里是文件)是需要重新编译的。为什么 驾驭 会知道我们并没有改变 和呢?答案很简单,通过文件的时冋戳!当 在运行一个 规则时,我们前面已绎提到了目标和先决条件之间的依赖关系, 在检查一个规则时,采用的 方法是:如果先决条件中相关的文件的时间戳大于目标的时间戳,即先决条件中的文件比目标更新, 则知道有变化,那么需要运行规则当中的命令重新构建目标。这条规则会运用到所有与我们在 时指定的目标的依赖树中的每一个规则。比如,对于项目,其依赖树中包括三个规则(如图 会检查所有三个规则当中的目标(文件)与先决条件(文件)之问的时问先后关系, 从而来决定是否要重新创建规则中的目标。 知道了是如何⊥作以后,我们不难想明白,为什么前面行角次时,还会重新 构建 可执行文件,因为 文件不存在,别忘了在 4成的是 而不 是 。我们将 做一点小小的改动,如图所示。其最后的运行结果则如图 所小。为什么还是和以前一样呢?哦,因为 中的第条规则中的目标是,而文件在 我们的编译过程中并不生成,即在第次编译时找不到,所以又重新编译了一遍 图 再一次更改后的 如图所示,而图是其最终的运行结果,它的确是发现了不 需要进行第二次的编洋。这正是我们所希望的! 驾驭 图 图 下面我们来验证一下如果对进行改动,是不是能币确的发现并从新构建所需。对于 工具,一个文件是否改动不是看文件大小,而是其时间我的境中只需用 命令来 改变文件的时间戳就行了,这相当于模拟了对文件进行了一次编加不需真正对其进行编辑。图 列出了所有相关的命令操作,从最终的结果来看 发 需要重新被编译,而这, 最终也导致了 需要重新被编译。 图 至地,你完全明白了什么是目标的依赖关系以及选择哪些目标需要重新编译的工作原理。 掌握如果在头脑中勾画(当然初学时,可以用纸画一画)出我们想让做的事的“依赖树”是 编 最为重要和关键的一步。后面我们需要做的是让 更加的简单但却更加的强大 假目标 在前面的 项目中,现在假设在程序所在的目录下面有一个文件,这个文件也可以 通过命令来创建。创建以后,运行 命令,你会发现 总是提示 文件是 最新的,而不是按我们所期望的那样进行文件删除操作,如图所示。从原理上我们还是可以 理解的,这是因为 将 当作文件,且在当前目录找到了这个文件,加上 目标没有 任何先决条件,所以,当我们要求为我们构建目标时,它就会认为是最新的。

...展开详情
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
qq_27761761 很好的资源,原网址已经不能下了
2017-10-27
回复
lidai0407 资源不错,写得不错
2016-05-03
回复
godspeed_song 正常虚席makefile,非常不错的资料
2015-01-31
回复
james2721 这个文档不错,对我有帮助。
2015-01-08
回复
A-Sam 还可以,慢慢看
2014-11-24
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
驾驭Makefile 37积分/C币 立即下载
1/0