没有合适的资源?快使用搜索试试~ 我知道了~
首页GNU Makefile详解与实战指南
"《GNUmake全面讲解》是一本由徐海兵翻译整理的关于GNUmake的中文手册,针对的是Linux和嵌入式开发环境中的makefile工具。该书详细介绍了GNUmake的基本用法、语法,并着重探讨如何为一个工程编写Makefile,这对于Linux程序员来说是必不可少的技能。作者在翻译过程中,不仅提供了语言层面的翻译,还结合自身工作经验对其进行了深度解析和实践分享,确保所有示例在支持GNUmake 3.8版本的系统中可运行。 由于作者认识到中文资料在这方面相对较少,他投入大量业余时间完成了这本书,旨在填补这一空白。书中内容涵盖了初学者到专业人士所需的知识,包括基础概念、高级技巧和新版本的特性和不兼容性。对于完全没有接触过GNUmake的读者,可以从基础部分开始了解,而对于有一定经验者,可以作为参考手册查阅新特性。 阅读本书前,读者需要具备对Linux常用工具(如gcc、as、ar、ld、yacc)的理解,以及基本的shell编程能力。书中还给出了几点阅读建议,无论你是初次接触还是希望提升技能,都能从中受益。作者鼓励读者在阅读过程中提出反馈,以共同进步。目前的版本为v1.5,最新的勘误和更新可以在作者的主页http://xhbdahai.cublog.cn获取。 通过《GNUmake全面讲解》,读者将能够更好地理解和掌握makefile在Linux项目开发中的关键作用,从而提高工程管理和开发效率。这是一本实用且有价值的资源,对于Linux开发者来说是一份宝贵的参考资料。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10466555/bg10.jpg)
Before reporting a bug or trying to fix it yourself, try to isolate it to the smallest
possible makefile that reproduces the problem. Then send us the makefile and the exact
results `make' gave you, including any error or warning messages. Please don't
paraphrase these messages: it's best to cut and paste them into your report. When
generating this small makefile, be sure to not use any non-free or unusual tools in your
commands: you can almost always emulate what such a tool would do with simple shell
commands. Finally, be sure to explain what you expected to occur; this will help us
decide whether the problem was really in the documentation.
Once you have a precise problem you can report it in one of two ways.Either send
electronic mail to:
bug-make@gnu.org
or use our Web-based project management tool, at:
http://savannah.gnu.org/projects/make/
In addition to the information above, please be careful to include the version number
of `make' you are using. You can get this information with the command `make
--version'. Be sure also to include the type of machine and operating system you are
using. One way to obtain this information is by looking at the final lines of output from the
command
`make --help'.
以上时 GNU make 的 bug 反馈方式。如果在你使用 GNU make 过程中。发
现 bug 或者问题。可以通过以上的方式和渠道反馈。
好了。开始我们的神奇之旅吧!
2.1 Makefile简介
在执行 make 之前,需要一个命名为 Makefile 的特殊文件(本文的后续将
使用 Makefile 作为这个特殊文件的文件名)来告诉 make 需要做什么(完成什
么任务),该怎么做。通常,make 工具主要被用来进行工程编译和程序链接。
本节将分析一个简单的 Makefile,它对一个包含 8 个 C 的源代码和三个头
文件的工程进行编译和链接。这个 Makefile 提供给了 make 必要的信息,make
程序根据 Makefile 中的规则描述执行相关的命令来完成指定的任务(如:编译、
链接和清除编译过程文件等)。复杂的 Makefile 我们将会在本文后续进行讨论。
当使用 make 工具进行编译时,工程中以下几种文件在执行 make 时将会
![](https://csdnimg.cn/release/download_crawler_static/10466555/bg11.jpg)
被编译(重新编译):
1.
所有的 源文件 没有被编译过 ,则 对各个 C 源文件 进行编译并 进 行
链接,生成最后的可执行程序;
2.
每 一个 在 上 次 执 行 make 之 后 修 改 过 的 C 源代 码 文 件 在 本次 执 行
make 时将会被重新编译;
3.
头文件在上一次执行 make 之后被修改。则所有包含此头文件的 C
源文件在本次执行 make 时将会被重新编译。
后两种情况是 make 只将修改过的 C 源文件重新编译生成.o 文件,对于没
有修改的文件不进行任何工作。重新编译过程中,任何一个源文件的修改将产生
新的对应的.o 文件,新的.o 文件将和以前的已经存在、此次没有重新编译的.o 文
件重新连接生成最后的可执行程序。
首先让我们先来看一些 Makefile 相关的基本知识。
2.2 Makefile规则介绍
一个简单的 Makefile 描述规则组成:
TARGET... : PREREQUISITES...
COMMAND
...
...
target:规则的目标。通常是最后需要生成的文件名或者为了实现这个目的
而必需的中间过程文件名。可以是.o 文件、也可以是最后的可执行程序的文件名
等。另外,目标也可以是一个 make “执行的动作的名称,如目标 clean”,我们
“ ”称这样的目标是 伪目标 。
prerequisites:规则的依赖。生成规则目标所需要的文件名列表。通常一个
目标依赖于一个或者多个文件。
command:规则的命令行。是规则所要执行的动作(任意的 shell 命令或者
是可在 shell 下执行的程序)。它限定了 make 执行这条规则时所需要的动作。
一个规则可以有多个命令行,每一条命令占一行。注意:每一个命令行必
须以[Tab]字符开始,[Tab]字符告诉 make 此行是一个命令 行。make 按照
命令完成相应的动作。这也是书写 Makefile 中容易产生,而且比较隐蔽的
错误。
![](https://csdnimg.cn/release/download_crawler_static/10466555/bg12.jpg)
命令就是在任何一个目标的依赖文件发生变化后重建目标的动作描述。一个
目 标 可 以 没 有 依 赖 而 只 有 动 作 ( 指 定 的 命 令 ) 。 比 如 Makefile 中 的 目 标
“clean”,此目标没有依赖,只有命令。它所定义的命令用来删除 make 过程产
生的中间文件(进行清理工作)。
在 Makefile “ ”中 规则 就是描述在什么情况下、如何重建规则的目标文件,
通常规则中包括了目标的依赖关系(目标的依赖文件)和重建目标的命令 。
make 执行重建目标的命令,来创建或者重建规则的目标(此目标文件也可以
是触发这个规则的上一个规则中的依赖文件)。规则包含了文件之间的依赖关
系和更新此规则目标所需要的命令。
一个 Makefile 文件中通常还包含了除规则以外的很多东西(后续我们会一
步一步的展开)。一个最简单的 Makefile 可能只包含规则。规则在有些 Makefile
中可能看起来非常复杂,但是无论规则的书写是多么的复杂,它都符合规则的
基本格式。
make 程序根据规则的依赖关系,决定是否执行规则所定义的命令的过程
我们称之为执行规则。
2.3 简单的示例
本小节开始我们在第一小节中提到的例子。此例子由3个头文件和8个C文件
组成。我们将书写一个简单的Makefile,来描述如何创建最终的可执行文件
“edit”,此可执行文件依赖于8个C源文件和3个头文件。Makefile文件的内容如
下:
#sample Makefile
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
![](https://csdnimg.cn/release/download_crawler_static/10466555/bg13.jpg)
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
首先书写时,可以将一个较长行使用反斜线(\)来分解为多行,这样可以
使我们的Makefile书写清晰、容易阅读理解。但需要注意:反斜线之后不能有
空格(这也是大家最容易犯的错误,错误比较隐蔽)。我们推荐将一个长行
分解为使用反斜线连接得多个行的方式。在完成了这个Maekfile以后;需要创建
“可执行程序 edit”,所要做的就是在包含此Makefile的目录(当然也在代码所在
“的目录)下输入命令 make” “。删除已经此目录下之前使用 make”生成的文件
(包括那些中间过程的.o “文件),也只需要输入命令 make clean”就可以了。
在这个Makefile中,我们的目标(target “)就是可执行文件 edit”和那些.o
文件(main.o,kbd.o….);依赖(prerequisites)就是冒号后面的那些 .c 文件
和 .h文件。所有的.o文件既是依赖(相对于可执行程序edit)又是目标(相对
于.c和.h文件)。命令包括 “cc –c maic.c” “、 cc –c kbd.c”……
当规则的目标是一个文件,在它的任何一个依赖文件被修改以后,在执行
“make”时这个目标文件将会被重新编译或者重新连接。当然,此目标的任何一
“个依赖文件如果有必要则首先会被重新编译。在这个例子中, edit”的依赖为8
个.o “文件;而 main.o” “的依赖文件为 main.c” “和 defs.h” “。当 main.c”或者
“defs.h” “被修改以后,再次执行 make” “, main.o”就会被更新(其它的.o文件
“不会被更新),同时 main.o” “的更新将会导致 edit”被更新。
在描述依赖关系行之下通常就是规则的命令行(存在一些些规则没有命令
行),命令行定义了规则的动作(如何根据依赖文件来更新目标文件)。命令行
![](https://csdnimg.cn/release/download_crawler_static/10466555/bg14.jpg)
必需以[Tab]键开始,以和Makefile其他行区别。就 是说所有 的命 令行必 需以
[Tab] 字符开始,但并不是所有的以[Tab]键出现行都是命令行。但make程
序会把 出现 在 第一条规则 之后的 所有以 [Tab]字符 开始的行 都作为 命令 行
来处理。(记住:make程序本身并不关心命令是如何工作的,对目标文件的更
“新需要你在规则描述中提供正确的命令。 make”程序所做的就是当目标程序需
要更新时执行规则所定义的命令)。
“目标 clean”不是一个文件,它仅仅代表执行一个动作的标识。正常情况下,
“不需要执行这个规则所定义的动作,因此目标 clean”没有出现在其它任何规则
的依赖列表中。因此在执行make时,它所指定的动作不会被执行。除非在执行
make “时明确地指定它。而且目标 clean”没有任何依赖文件,它只有一个目的,
就是通过这个目标名来执行它所定义的命令。Makefile中把那些没有任何依赖
“ ”只有执行动作的目标称为 伪目标 (phony targets) “。需要执行 clean”目
标所定义的命令,可在shell下输入:make clean。
2.4
make如何工作
默认的情况下,make 执行的是 Makefile 中的第一个规则,此规则的第一
“ ” “ ”个目标称之为 最终目的 或者 终极目标 (就是一个 Makefile 最终需要更新或
者创建的目标。
上例的 Makefile “,目标 edit”在 Makefile 中是第一个目标,因此它就是
make “ ”的 终极目标 。当修改了任何 C 源文件或者头文件后,执行 make 将会重
“建终极目标 edit”。
当 在 shell “提 示 符 下 输 入 make” 命 令 以 后 。 make 读 取 当 前 目 录 下 的
Makefile 文件,并将 Makefile “ ”文件中的第一个目标作为其执行的 终极目标 ,
开始处理第一个规则(终极目标所在的规则)。在我们的例子中,第一个规则就
“是目标 edit” “所在的规则。规则描述了 edit”的依赖关系,并定义了链接.o 文件
“生成目标 edit”的命令; make 在执行这个规则所定义的命令之前,首先处理目
“标 edit”的所有的依赖文件(例子中的那些.o 文件)的更新规则(以这些.o 文
件为目标的规则)。对这些.o 文件为目标的规则处理有下列三种情况:
1.
目标.o 文件不存在,使用其描述规则创建它;
剩余217页未读,继续阅读
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://profile-avatar.csdnimg.cn/c5ca5cf573c243da97d6f064dae9429f_qq_35463307.jpg!1)
qq_35463307
- 粉丝: 0
- 资源: 15
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 新型矿用本安直流稳压电源设计:双重保护电路
- 煤矿掘进工作面安全因素研究:结构方程模型
- 利用同位素位移探测原子内部新型力
- 钻锚机钻臂动力学仿真分析与优化
- 钻孔成像技术在巷道松动圈检测与支护设计中的应用
- 极化与非极化ep碰撞中J/ψ的Sivers与cos2φ效应:理论分析与COMPASS验证
- 新疆矿区1200m深孔钻探关键技术与实践
- 建筑行业事故预防:综合动态事故致因理论的应用
- 北斗卫星监测系统在电网塔形实时监控中的应用
- 煤层气羽状水平井数值模拟:交替隐式算法的应用
- 开放字符串T对偶与双空间坐标变换
- 煤矿瓦斯抽采半径测定新方法——瓦斯储量法
- 大倾角大采高工作面设备稳定与安全控制关键技术
- 超标违规背景下的热波动影响分析
- 中国煤矿选煤设计进展与挑战:历史、现状与未来发展
- 反演技术与RBF神经网络在移动机器人控制中的应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)