没有合适的资源?快使用搜索试试~ 我知道了~
首页详解Makefile编程:入门到实践指南
"Makefile编程是一门强大的自动化构建工具,本文档深入浅出地介绍了GNU Makefile的相关知识,适用于初学者和进阶者。首先,它涵盖了Makefile的基础概念,如Makefile简介,它是用于自动化管理软件项目编译、链接和清理过程的文本文件。Makefile通过一系列规则定义,根据源代码的变化自动触发相应的编译步骤。 在第二章,详细介绍了Makefile的工作原理,包括如何解析规则、指定变量、自动推导规则以及支持的不同风格和功能,如清除工作目录过程文件。此外,还重点讨论了Makefile的总述,包括其内容结构、命名规范、文件包含、特殊变量和makefile的重建与重载。 章节四深入规则部分,通过实例展示了规则的语法,依赖类型的管理,以及文件名通配符的使用,包括其优点和限制。目录搜索机制,如VPATH、vpath等,对于理解Makefile如何查找源文件至关重要。此外,还提到了伪目标、强制目标、空目标文件、特殊目标以及多目标和多规则目标的处理方式,这些都是编写高效Makefile的关键。 静态模式和双冒号规则也是本章的重要内容,它们为更复杂的构建流程提供了灵活性。这份文档不仅适合学习Makefile的基本用法,还涵盖了高级特性,对提高软件开发效率具有实际指导意义。" 通过阅读这份文档,读者将掌握如何创建和管理Makefile来驱动高效的项目构建,从而在IT开发工作中更加得心应手。
资源详情
资源推荐
GNU make
中文手册
出现,第二次:规则命令行中作为“cc”的参数列表。这样做所带来的问题是:如果我
们需要为目标“edit”增加一个的依赖文件,我们就需要在两个地方添加(依赖文件列
表和规则的命令中)。添加时可能在“edit”的依赖列表中加入了、但却忘记了给命令
行中添加,或者相反。这就给后期的维护和修改带来了很多不方便,添加或修改时出现
遗漏。
为了避免这个问题,在实际工作中大家都比较认同的方法是,使用一个变量
“objects”、“OBJECTS”、“objs”、“OBJS”、“obj”或者“OBJ”来作为所有的.o 文
件的列表的替代。在使用到这些文件列表的地方,使用此变量来代替。在上例的 Makefile
中我们可以添加这样一行:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
“objects”作为一个变量,它代表所有的.o文件的列表。在定义了此变量后,我们
就可以在需要使用这些.o文件列表的地方使用“$(objects)”来表示它,而不需要罗列
所有的.o文件列表(变量可参考 第六章 使用变量)。因此上例的规则就可以这样写:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
…….
…….
clean :
rm edit $(objects)
当我们需要为终极目标“edit”增加或者去掉一个.o 依赖文件时,只需要改变
“objects”的定义(加入或者去掉若干个.o 文件)。这样做不但减少书写的工作量,而
且可以减少修改而产生错误的可能。
2.6 自动推导规则
在使用make编译.c源文件时,编译.c源文件规则的命令可以不用明确给出。这是因
为make本身存在一个默认的规则,能够自动完成对.c文件的编译并生成对应的.o文件。
它执行命令“cc -c”来编译.c源文件。在Makefile中我们只需要给出需要重建的目标文
2004年9月11日
16
GNU make
中文手册
件名(一个.o文件),make会自动为这个.o文件寻找合适的依赖文件(对应的.c文件。
对应是指:文件名除后缀外,其余都相同的两个文件),而且使用正确的命令来重建这
个目标文件。对于上边的例子,此默认规则就使用命令“cc -c main.c -o main.o”来创
建文件“main.o”。对一个目标文件是“N.o”,倚赖文件是“N.c”的规则,完全可以省
略其规则的命令行,而由make自身决定使用默认命令。此默认规则称为make的隐含规
则(关于隐含规则可参考 第十章 使用隐含规则)
这样,在书写 Makefile 时,我们就可以省略掉描述.c 文件和.o 依赖关系的规则,
而只需要给出那些特定的规则描述(.o 目标所需要的.h 文件)。因此上边的例子就可以
以更加简单的方式书写,我们同样使用变量“objects”。Makefile 内容如下:
# sample Makefile
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
rm edit $(objects)
这种格式的Makefile更接近于我们实际应用。(关于目标“clean”的详细说明我们
在后边。参考
4.6 Makefile伪目标 一节 和 5.4 命令的错误 一节)
make 的隐含规则在实际工程的 make 中会经常使用,它使得编译过程变得方便。
几乎在所有的 Makefile 中都用到了 make 的隐含规则,make 的隐含规则是非常重要的
一个概念。后续我们会在第十章会有专门的讨论。
2.7 另类风格的makefile
上一节中我们提到过,Makefile 中,所有的.o 目标文件都可以使用隐含规则由 make
2004年9月11日
17
GNU make
中文手册
自动重建,我们可以根据这一点书写更加简洁的 Makefile。而且在这个 Makefile 中,
我们是根据依赖而不是目标对规则进行分组。形成另外一种风格的 Makefile。实现如下:
#sample Makefile
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
本例中,我们以三个头文件为出发点,对依赖于每一个头文件的目标进行合并。书
写出一个多目标规则,规则中多个目标同时依赖于对应的头文件,而且同一个文件可能
同时存在多个规则中。例子中头文件“defs.h”作为所有.o 文件的依赖文件。其它两个
头文件作为规则所有目标文件(多个.o 文件)的依赖文件。
这种风格的 Makefile 并不值得我们借鉴。问题在于:同时把多个目标文件的依赖
放在同一个规则中进行描述(一个规则中含有多个目标文件),这样导致规则定义不明
了,比较混乱。建议大家不要在 Makefile 中采用这种方式了书写。否则后期维护将会
是一件非常痛苦的事情。
书写规则建议的方式是:单目标,多依赖。就是说尽量要做到一个规则中只存在一
个目标文件,可有多个依赖文件。尽量避免使用多目标,单依赖的方式。这样书写的好
处是后期维护会非常方便,而且这样做会使 Makefile 会更清晰、明了。
2.8 清除工作目录过程文件
规则除了完成源代码编译之外,也可以完成其它任务。例如:前边提到的为了实现
清除当前目录中编译过程中产生的临时文件(edit 和哪些.o 文件)的规则:
clean :
rm edit $(objects)
在实际应用时,我们把这个规则写成如下稍微复杂一些的样子。以防止出现始料未
及的情况。
2004年9月11日
18
GNU make
中文手册
.PHONY : clean
clean :
-rm edit $(objects)
这两个实现有两点不同: 1. 通过“.PHONY”特殊目标将“clean”目标声明为伪
目标。避免当磁盘上存在一个名为“clean”文件时,目标“clean”所在规则的命令无
法执行(参考 4.6 Makefile伪目标 一节)。2. 在命令行之前使用“-”,意思是忽略命令
“rm”的执行错误(参考 5.4 命令的错误 一节)。
这样的一个目标在 Makefile 中,不能将其作为终极目标(Makefile 的第一个目标)。
因为我们的初衷并不是当你在命令行上输入 make 以后执行删除动作。而是要创建或者
更新程序。在我们上边的例子中。就是在输入 make 以后要需要对目标“edit”进行创
建或者重建。
上例中因为目标“clean”没有出现在终极目标“edit”依赖关系中(终极目标的直
接依赖或者间接依赖),所以我们执行“make”时,目标“clean”所在的规则将不会
被处理。当需要执行此规则,要在make的命令行选项中明确指定这个目标(执行“make
clean”)。关于make的执行可参考 9.2 指定终极目标 一节。
2004年9月11日
19
GNU make
中文手册
第三章:Makefile 总述
3 Makefile总述
3.1 Makefile的内容
在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量定义、
指示符和注释。关于“规则”、“变量”和“Makefile 指示符”将在后续的章节进行详细
的讨论。本章讨论的是一些基本概念。
显式规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件
(Makefile 的目标文件)。书 写 Makefile 时需要明确地给出目标文件、目标的
依赖文件列表以及更新目标文件所需要的命令(有些规则没有命令,这样的
规则只是纯粹的描述了文件之间的依赖关系)。
隐含规则:它是make根据一类目标文件(典型的是根据文件名的后缀)而自
动推导出来的规则。make根据目标文件的名,自动产生目标的依赖文件并使
用默认的命令来对目标进行更新(建立一个规则)。关于隐含规则可参考 第
十章 make的隐含规则
变量定义:使用一个字符或字符串代表一段文本串,当定义了一个变量以后,
Makefile后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串
的使用。第一章的例子中,我们就定义了一个变量“objects”来表示一个.o
文件列表。关于变量的详细讨论可参考
第六章 Makefile中的变量
Makefile 指示符:指示符指明在 make 程序读取 makefile 文件过程中所要执
行的一个动作。其中包括:
读取一个文件,读取给定文件名的文件,将其内容作为makefile文件的一
部分。参考 3.3 包含其它makefile文件一节
决定(通常是根据一个变量的得值)处理或者忽略Makefile中的某一特定
部分。参考
第七章Makefile的条件执行
定义一个多行变量。参考 6.8 多行定义 一节
注释:Makefile 中“#”字符后的内容被作为是注释内容(和 shell 脚本一样)
处理。如果此行的第一个非空字符为“#”,那么此行为注释行。注释行的结
2004年9月11日
20
剩余198页未读,继续阅读
跺不死的蜗牛
- 粉丝: 2
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多模态联合稀疏表示在视频目标跟踪中的应用
- Kubernetes资源管控与Gardener开源软件实践解析
- MPI集群监控与负载平衡策略
- 自动化PHP安全漏洞检测:静态代码分析与数据流方法
- 青苔数据CEO程永:技术生态与阿里云开放创新
- 制造业转型: HyperX引领企业上云策略
- 赵维五分享:航空工业电子采购上云实战与运维策略
- 单片机控制的LED点阵显示屏设计及其实现
- 驻云科技李俊涛:AI驱动的云上服务新趋势与挑战
- 6LoWPAN物联网边界路由器:设计与实现
- 猩便利工程师仲小玉:Terraform云资源管理最佳实践与团队协作
- 类差分度改进的互信息特征选择提升文本分类性能
- VERITAS与阿里云合作的混合云转型与数据保护方案
- 云制造中的生产线仿真模型设计与虚拟化研究
- 汪洋在PostgresChina2018分享:高可用 PostgreSQL 工具与架构设计
- 2018 PostgresChina大会:阿里云时空引擎Ganos在PostgreSQL中的创新应用与多模型存储
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功