跟我一起写Makefile

所需积分/C币:9 2012-03-03 19:47:16 528KB PDF
3
收藏 收藏
举报

很好的文档
第一章概述 什么是 或许很多 的程序员都不知道这个东西,因为那些 的都为你做了这个工作,但我觉得要作一个好的和 的程序员, 还是要懂。这就好像现在有这么多的的编辑器,但如果你想成为一个专业 人上,你还是要了解 的标识的含义。特别在 下的软件编译,你就不能不自凵写 了,会不会写 ,从一个侧面说明了一个人是否具备完成人型工程的能 力 因为 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、 功能、模块分别放在若干个日录中 定义了一系列的规则来指定,哪些文件需要 先编译,哪些文件需要后编译,哪塏文件需要重新编译,甚至于进行更复杂的功能操作,因 为 就像 脚本一样,其中也可以执行操作系统的命令。 带来的好处就是——“自动化编译”,旦写好,只需要个命令,整个⊥ 程完仝自动编译,极大的提高了软件开发的效率。 是一个命令工具,是一个解释 中指令的命令工具,一般来说,大多数的都有这个命令,比如: 的 的 的 可见 都成为了一种 在工程方面的编译方法。 现在讲述如何写 的文章比较少,这是我想与这篇文章的原因。当然,不同产商的 各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅 对的进行讲述,我的坯境是 的版木是 。必竟, 这个 是应用最为广泛的,也是用得最多的。而且其还是最遵循于 标准的 在这篇文档中,将以 的源码作为我们基础,所以必然涉及一些关于 的编译的 知识,相关于这方面的内容,迩请各位査看相关的编译器的文档。这里所默认的编译器是 下的和 第二章关于程序的编译和链接 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是 、还是 首先要把源文件编译成中间代码文件,在 下也就是 文件 下是文 件,即 ,这个动作叫做编译( )。然后再把大量的 合成执行文件,这个动作叫做链接()。 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对」后者,通常是你需要 告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在 文件中 只要所有的语法止确,编译器就可以编译出中间目标文件。般来说,每个源文件都应该对 应于一个中间目标文件(文件或是文件) 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中问目标文件(文件或是 文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标 文件( ),在大多数时候,由于源文件太多,编译生成的中间目标文件太多 而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目 标文件打个包,在 下这种包叫“库文件”( ,也就是 文件, 在 卜,是 也就是文件。 总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时, 编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编详器会给出一个 警告,但可以生成 而在链接程序时,链接器会在所有的 中 找寻函数的实现,如果找不到,那到就会报链接错误码 ),在下,这种 错误一般是 错误,意思说是说,链接器未能找到函数的实现。你需要指定函 数的 好,言归正传,的有许多的内容,闲言少叙,还是让我们开始吧 第三章 介绍 命令执行时,需要一个 文件,以告诉命令需要怎么样的去编译和链 接程序。 首先,我们用一个示例来说明 的书写规则。以便给人家一个感兴认识。这个示例 来源于的使用手册,在这个示例中,我们的工程有个文件,和个头文件, 我们要写一个 来告诉命令如何编译和链接这几个文件。我们的规则是: )如果这个工程没有编译过,那么我们的所有文件都要编译)被链接。 )如果这个工程的杲几个文件被修改,那么我们只编译被修改的文件,并链接目 标程序。 )如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的文件, 并链接目标程序。 只要我们的 写得够好,所有的这切,我们只用个命令就可以完成, 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所 需要的文件和链接目标程序。 的规则 在讲述这个 之前,还是让我们先来粗略地看一看 的规则。 也就是一个目标文件,可以是 也可以是执行文件。还可以是 个标签( ),对」标签这种特性,在后续的“伪目标”章节中会有叙述 就是,要生成那个 所需要的文件或是目标 也就是需要执行的命令。(任意的 命令) 这是一个文件的依赖关系,也就是说 这一个或多个的日标文件依赖于 中的文件,其生成规则定义在 中。说白一点就是说, 中如果有一个以上的文件比 文件要新的话 所定义的 命令就会被执行。这就是 的规则。也就是 中最核心的内容 说到底, 的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然, 这是 的主线和核心,但要写好一个 还不够,我会以后面一点一点地 结合我的工作经验给你慢慢到来。内容还多着呢。) 一个示例 正如前面所说的,如果·个上程有个头文件,和个文件,我们为了完成前面所述的那 三个规则,我们的 应该是下面的这个样子的 反斜杠()是换行符的意思。这样比较便于 的易读。我们可以把这个内容保存 在文件为“ 或 的文件中,然后在该目录下直接输入命令“ 就可以生成执行文件。如果要删除执行文件和所有的中间目标文件,那么,只要筍单 地执行一下“ ”就可以了。 在这个 中,日标文件( )包含:执行文件和中间日标文件(), 依赖文件 )就是冒号后面的那些文件和文件。每一个文件 都有一组依赖文件,前这些文件又是执行文件 的依赖文件。依赖关系的实质上 就是说明了目标文件是山哪些文件牛成的,换言之,目标文件是哪些文件更新的。 在定义好依赖关系后,后续的那一行定义了如何生成日标文件的操作系统命令,一定要以 键作为开头。记住,并不管命令是怎么工作的,他只管执行所定义的命令。 会比较 文件和 文件的修改口期,如果 文件的 日期要比 文件的日期要新,或者 不存在的话,那么,就会执行后续 定义的命令。 这里要说明一点的是, 不是一个文件,它只不过是一个动作名字,有点像语言中的 样,其冒号后什么也没有,那么, 就不会自动去找文件的依赖性,也就不会 臼动执行其后所定义的命令。要执行其后的命令,就要在命令后明显得指出这个 的名字。这样的方法非常有用,我们可以在一个 中定义不用的编译或是和编译无 关的命令,比如程序的打包,程序的备份,等等。 是如何工作的 在默认的方式下,也就是我们只输入命令。那么, 会在当前日录下找名字叫“ 或 的文件。 如果找到,它会找文件中的第一个目标文件( ),在上面的例子中,他会找 到“”这个文件,并把这个文件作为最终的目标文件 、如果文件不存在,或是所依赖的后面的文件的文什修改时间要比 这个文件新,那么,他就会执行后面所定义的命令来生成这个文件 如果所依赖的文件也存在,那么会在当前文件中找目标为文件的 依赖性,如果找到则再根据那一个规则生成文件。(这有点像一个堆栈的过程) 、当然,你的文件和文件是存在的啦,于是会生成文件,然后再用 文件住命 的终极仟务,也就是执行文件 这就是整个 的依赖性, 会一层又一层地去找文件的依赖关系,直到最终编译出 第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 就会直接退出,并报错,前对于所定义的命令的错误,或是编译不成功, 根木不理 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那 么对不起,我就不工作啦 通过上述分析,我们知道,像 这种,没有被第一个目标文件直接或间接关联,那么 它后面所定义的命令将不会被自动执行,不过,我们可以显示要 执行。即命令 ,以此来淸除所有的目标文件,以便重编译。 于是在我们编程中,如果这个工程凵被编译过了,当我们修改了其中一个源文件,比如 那么根据我们的依赖性,我们的目标 会被重编译(也就是在这个依性关 系后面所定义的命令),于是 的文件也是最新的啦,于是 的文件修改时间 要比要新,所以也会被重新链接了(详见日标文件后定义的命令) 而如果我们改变了“ ”,那么, 和 都会被重编译, 并且, 会被重链接。 四 中使用变量 在上面的例子中,先让我们看看 的规则 我们可以看到文件的宇符串被重复了两次,如果我们的工程需要加入一个新的文 件,那么我们需要在两个地方加(应该是三个地方,还有一个地方在 中)。当然,我 们的 并不复,所以在两个地方加也不累,但如果 变得复杂,那么 我们就有可能会忘掉一个需要加入的地方,而导致编详失败。所以,为了 的易维 护,在 中我们可以使用变量。 的变量也就是一个字符串,理解成 语言中的宏可能会更好 比如,我们声明个变量, 或是 反 正不管什么啦,只要能够表小文件就行了。我们在 开始就这样定义 于是,我们就可以很方便地在我们的 中以“ ”的方式来使用这个变 量了,于是我们的改良版 就变成下面这个样子 于是如果有新的文件加入,我们只需简单地修改 变量就可以了 关于变量更多的话题,我会在后续给你一一道来。 五、让 自动推导 的很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必 要去在每一个文件后都写上类似的命令,因为,我们的会自动识别,并自凵推导 命令。 只要 看到一个文件,它就会自动的把文件加在依赖关系中,如果 找 到一个 那么 就会是 的依赖文件。并且 也会被推导出来,」是,我们的 再也不用写得这么复杂。我们的 是新的 又出炉了。 这种方法,也就是的“隐悔规则”。上面文件内容中,“ ”表示, 是个 伪日标文件。 关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来 六、另类风格的 即然我们的 可以自动推导命令,那么我看到那堆和的依赖就有点不爽,那 么多的重复的 能不能把其收拢起来,好吧,没有问题,这个对于来说很容易, 谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的 这种风格,让我们的 变得很简单,但我们的文件依赖关系就显得有点凌乱了。鱼 和熊掌不可兼得。还看你的喜好了。我是不喜欢这种风格的,是文件的依赖关系看不清楚, 二是如果文件一多,要加入几个新的文件,那就理不清楚了。 七、清空目标文件的规则 每个 中都应该写一个清空目标文件(和执行文件)的规则,这不仅便于重编 译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《缤程修养》吗)。 般的风格都是 更为稳健的做法是

...展开详情
试读 75P 跟我一起写Makefile
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享宗师

关注 私信
上传资源赚钱or赚积分
最新推荐
跟我一起写Makefile 9积分/C币 立即下载
1/75
跟我一起写Makefile第1页
跟我一起写Makefile第2页
跟我一起写Makefile第3页
跟我一起写Makefile第4页
跟我一起写Makefile第5页
跟我一起写Makefile第6页
跟我一起写Makefile第7页
跟我一起写Makefile第8页
跟我一起写Makefile第9页
跟我一起写Makefile第10页
跟我一起写Makefile第11页
跟我一起写Makefile第12页
跟我一起写Makefile第13页
跟我一起写Makefile第14页
跟我一起写Makefile第15页

试读结束, 可继续读5页

9积分/C币 立即下载