没有合适的资源?快使用搜索试试~ 我知道了~
跟我写Makefile(陈皓)
需积分: 14 3 下载量 71 浏览量
2018-08-06
11:38:18
上传
评论
收藏 114KB DOCX 举报
温馨提示
试读
64页
自制word,带书签,方便检索,doc直接编辑,想转pdf自己转就行。 作者是陈皓,我只是搬运工。
资源推荐
资源详情
资源评论
跟我一起写
1. makefile 很重要
什么是 ?或许很多 的程序员都不知道这个东西,因为那些
的 都为你做了这个工作,但我觉得要作一个好的和
的程序员, 还是要懂。这就好像现在有这么多的 的编辑器,但
如果你想成为一个专业人士,你还是要了解 的标识的含义。特别在
下的软件编译,你就不能不自己写 了,会不会写 ,从一个侧
面说明了一个人是否具备完成大型工程的能力。因为, 关系到了整个
工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放
在若干个目录中, 定义了一系列的规则来指定,哪些文件需要先编译,
哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,
因为 就像一个 脚本一样,其中也可以执行 操作系统的命令。
带来的好处就是——“自动化编译”,一旦写好,只需要一个 命令,
整个工程完全自动编译,极大的提高了软件开发的效率。 是一个命令工
具,是一个解释 中指令的命令工具,一般来说,大多数的 都有这
个 命 令 , 比 如 : 的 , 的 , 下 的
。可见, 都成为了一种在工程方面的编译方法。
现在讲述如何写 的文章比较少,这是我想写这篇文章的原因。当然,
不同产商的 各不相同,也有不同的语法,但其本质都是在“文件依赖性”上
做 文 章 , 这 里 , 我 仅 对 的 进 行 讲 述 , 我 的 环 境 是
!"#$%, 的版本是 &$#%。必竟,这个 是应用最为广泛的,
也 是 用 得 最 多 的 。 而 且 其 还 是 最 遵 循 于 '%%&$()'**( 标 准 的
(+,-$()。
在这篇文档中,将以 .的源码作为我们基础,所以必然涉及一些关于 .
的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这
里所默认的编译器是 - 下的 和 。
1.1 关于程序的编译和链接
在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是 、
、还是 ,首先要把源文件编译成中间代码文件,在 下也就是$/0
文件, - 下是$ 文件,即 ,/01"2,这个动作叫做编译(compile)。然
后再把大量的 ,/01"2 合成执行文件,这个动作叫作链接()。
编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,
通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义
应该放在 .文件中),只要所有的语法正确,编译器就可以编译出中间目
标文件。一般来说,每个源文件都应该对应于一个中间目标文件(, 文件或是
,34 文件)。
链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件
(, 文件或是 ,34 文件)来链接我们的应用程序。链接器并不管函数所在的源
文件,只管函数的中间目标文件(,/01"2),在大多数时候,由于源文件太
多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件
名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在
下 这 种 包 叫 “ 库 文 件 ” ( LibraryFile) , 也 就 是 $/ 文 件 , 在 - 下 , 是
5162,也就是$ 文件。
总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。
在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被
声明,编译器会给出一个警告,但可以生成 ,/01"2。而在链接程序时,链
接器会在所有的 ,/01"2 中找寻函数的实现,如果找不到,那到就会报链接
错误码(),在 下,这种错误一般是:(%%' 错误,意思说
是说,链接器未能找到函数的实现。你需要指定函数的 ,/01"2$
好,言归正传, 的 有许多的内容,闲言少叙,还是让我们开始吧。
2. Makefile 介绍
命令执行时,需要一个 文件,以告诉 命令需要怎么样的
去编译和链接程序。
首先,我们用一个示例来说明 的书写规则。以便给大家一个感性认识。
这个示例来源于 的 使用手册,在这个示例中,我们的工程有 # 个
文件,和 & 个头文件,我们要写一个 来告诉 命令如何编译和链
接这几个文件。我们的规则是:
')如果这个工程没有编译过,那么我们的所有 文件都要编译并被链接。
()如果这个工程的某几个 文件被修改,那么我们只编译被修改的 文件,
并链接目标程序。
&)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的
文件,并链接目标程序。
只要我们的 写得够好,所有的这一切,我们只用一个 命令就可
以完成, 命令会自动智能地根据当前的文件修改的情况来确定哪些文件
需要重编译,从而自己编译所需要的文件和链接目标程序。
2.1 Makefile 的规则
在讲述这个 之前,还是让我们先来粗略地看一看 的规则。
"7"$$$89"$$$
1
$$$
$$$
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
target 也就是一个目标文件,可以是 ObjectFile,也可以是执行文件。还可以
是一个标签(/),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites 就是,要生成那个 "7" 所需要的文件或是目标。
command 也就是 需要执行的命令。(任意的 命令)
这是一个文件的依赖关系,也就是说,"7" 这一个或多个的目标文件依赖于
9" 中的文件,其生成规则定义在 1 中。说白一点就是说,
9" 中如果有一个以上的文件比 "7" 文件要新的话,1 所定
义的命令就会被执行。这就是 的规则。也就是 中最核心的内
容。
说到底, 的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。
还不尽然,这是 的主线和核心,但要写好一个 还不够,我会
以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。:)
2.2 一个示例
正如前面所说的,如果一个工程有 & 个头文件,和 # 个 文件,我们为了完成
前面所述的那三个规则,我们的 应该是下面的这个样子的。
"8$:/$:1$;$<
"$:1$:$"$
11)"$/$1$;$<
"$1$$"$
$8$1:$
11:=1:$1
/$8/$1:$:1$
11:=1:/$1
1$81$1:$1$
11:=1:1$1
;$8;$1:$/$
剩余63页未读,继续阅读
资源评论
折腾怪
- 粉丝: 897
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功