### 跟我一起学Makefile #### 概述 Makefile是一种用于自动化构建过程的脚本文件,广泛应用于软件开发领域。通过定义一系列规则,Makefile能够帮助开发者轻松完成项目构建、清理等任务,极大地提高了开发效率。本文将详细介绍Makefile的基础知识及其在实际项目中的应用。 #### 关于程序的编译和链接 在软件开发过程中,程序通常由多个源文件组成,每个源文件可能需要被单独编译成目标文件,然后再进行链接生成可执行文件。这一过程如果手动完成不仅繁琐且容易出错。Makefile正是为了解决这个问题而设计的,它可以通过自动化的规则来管理这些编译和链接过程。 #### Makefile介绍 1. **Makefile的规则**:Makefile的核心是其规则定义,包括显式规则、隐式规则等。规则用于描述如何构建目标文件。 2. **一个示例**:通常一个简单的Makefile示例会包含一个目标(如`all`),以及相应的命令来构建这个目标。 3. **make是如何工作的**:make工具读取Makefile文件中的规则,然后根据这些规则来执行相应的命令,最终生成所需的目标文件。 4. **makefile中使用变量**:Makefile支持变量定义,可以用来存储路径、文件名等信息,使得Makefile更加灵活和易于维护。 5. **让make自动推导**:通过定义模式规则,make可以根据文件名的前后缀自动推导出构建过程,减少显式规则的数量。 6. **另类风格的makefile**:除了标准的Makefile格式外,还有其他风格的Makefile,比如使用特定的文件名或语法结构。 7. **清空目标文件的规则**:为了保持项目的整洁,Makefile通常还会定义清理规则,如`clean`目标,用于删除编译产生的临时文件。 #### Makefile总述 1. **Makefile里有什么?** - 显式规则:定义了如何从一个或多个源文件构建一个目标文件的具体步骤。 - 隐式规则:make工具内置的一系列规则,可以根据目标文件的扩展名自动识别并执行相应的构建命令。 - 变量的定义:用于简化Makefile的编写,提高其可读性和可维护性。 - 文件指示:允许在Makefile中引入其他文件的内容。 - 注释:以`#`开头的行被视为注释,用于解释Makefile的目的或功能。 2. **Makefile的文件名**:虽然默认情况下,make工具会查找名为`Makefile`或`makefile`的文件,但也可以通过命令行参数指定其他文件名。 3. **引用其它的Makefile**:有时候需要将复杂的Makefile拆分成多个小文件,可以通过`include`指令来引入这些文件。 4. **环境变量MAKEFILES**:这个环境变量可以用来指定Makefile的搜索路径,使得make工具能够在多个目录中查找Makefile文件。 5. **make的工作方式**:make工具读取Makefile文件中的规则,并根据这些规则确定构建过程。它会检查文件的时间戳来决定是否需要重新编译某些文件。 #### 书写规则 1. **规则举例**:例如,`all: obj/main.o obj/sub.o` 表示当构建`all`目标时,需要先构建`obj/main.o`和`obj/sub.o`这两个目标文件。 2. **规则的语法**:规则通常由目标、依赖项和命令组成。 3. **在规则中使用通配符**:通配符可以用来匹配一组文件名,使得Makefile更具有通用性。 4. **文件搜寻**:make工具会在当前目录及其子目录中搜索指定的文件,可以通过`VPATH`变量指定额外的搜索路径。 5. **伪目标**:像`all`、`clean`这样的目标被称为伪目标,它们没有对应的文件,只是用于组织其他规则。 6. **多目标**:一条规则可以有多个目标,这在需要构建多个相关文件时非常有用。 7. **静态模式**:静态模式规则允许使用通配符匹配多个文件,并为所有匹配的文件定义相同的依赖关系和构建命令。 #### 使用条件判断 1. **示例**:通过条件语句可以在Makefile中实现逻辑判断,例如根据不同的条件执行不同的命令。 2. **语法**:使用`ifeq`、`ifdef`等关键字来实现条件分支。 #### 使用函数 1. **函数的调用语法**:Makefile提供了丰富的内置函数,用于字符串处理、文件名操作等。 2. **字符串处理函数**: - `subst`:替换字符串中的模式。 - `patsubst`:模式替换函数,用于将一组文件名转换为另一组。 - `strip`:去除字符串首尾的空白字符。 - `findstring`:查找一个字符串在另一个字符串中的位置。 - `filter`:从一个列表中筛选出符合特定模式的元素。 - `filter-out`:与`filter`相反,从列表中移除符合特定模式的元素。 - `sort`:对列表排序。 - `word`、`wordlist`、`words`、`firstword`:用于处理列表中的单词。 3. **文件名操作函数**: - `dir`:提取路径中的目录部分。 - `notdir`:提取路径中的文件名部分。 - `suffix`:返回文件的扩展名。 - `basename`:返回文件的基本名称(去除扩展名)。 - `addsuffix`:在字符串末尾添加扩展名。 - `addprefix`:在字符串前添加前缀。 - `join`:将两个列表中的元素组合起来形成新的列表。 4. **foreach函数**:对于列表中的每一个元素执行一个函数。 5. **if函数**:实现条件判断的功能。 6. **call函数**:用于调用其他函数。 7. **origin函数**:返回变量的来源。 #### make的运行 1. **make的退出码**:用于表示make执行的结果状态。 2. **指定Makefile**:通过命令行参数`-f`或`--file`指定Makefile文件。 3. **指定目标**:默认情况下,make会寻找名为`all`的目标;可以通过命令行参数指定其他目标。 4. **检查规则**:使用`-n`或`--just-print`选项只打印将要执行的命令而不真正执行。 5. **make的参数**:make支持多种命令行选项,用于控制其行为。 #### 隐含规则 1. **使用隐含规则**:make内置了一系列的隐含规则,可以根据目标文件的扩展名自动选择合适的编译器和编译选项。 2. **隐含规则一览**:列出了一些常见的隐含规则,如C语言、C++语言等的编译规则。 3. **隐含规则使用的变量**:定义了用于控制隐含规则行为的变量。 4. **隐含规则链**:多个隐含规则可以链接在一起,形成更复杂的构建流程。 5. **定义模式规则**:模式规则是隐含规则的一种特殊形式,它可以使用通配符匹配多个文件。 6. **老式风格的"后缀规则"**:这是一种较早版本Makefile中使用的规则风格,现在已经被模式规则所取代。 7. **隐含规则搜索算法**:描述了make如何搜索和应用隐含规则的过程。 #### 使用make更新函数库文件 1. **函数库文件的成员**:介绍如何处理函数库文件中的各个成员文件。 2. **函数库成员的隐含规则**:make也提供了一组针对函数库文件成员的隐含规则。 3. **函数库文件**:讨论了如何利用Makefile来管理和构建函数库文件。 通过以上内容的学习,我们可以了解到Makefile不仅仅是一个简单的构建脚本,它还包含了丰富的特性和功能,可以帮助我们高效地管理项目构建过程。无论是对于初学者还是有经验的开发者来说,掌握Makefile都是非常有益的。
剩余77页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于SpringBoot的遥感影像共享系统源码(java毕业设计完整源码).zip
- (175624016)C# ModbusRtu或者TCP协议上位机源码,包括存储,数据到SQL SERVER数据库,趋势曲线图,数据报表,实时和历史报
- 棒板电极流注放电, COMSOL,氩气形成的贯穿流注 氩气放电等离子体仿真
- 基于web家庭财务管理系统.doc
- Unity入门教程:创建可控制移动并支持碰撞变色的小球
- (175710838)C#含有ModbusRtu通讯库,通讯示例 硬件设备测试例程
- 基于springboot的青少年心理健康教育网站的设计与实现源码(java毕业设计完整源码+LW).zip
- (175829054)python在线电影推荐系统源码数据库演示.zip
- 基于web的家校通管理系统的设计及实现 .doc
- 基于SpringBoot的高校电动车租赁服务业务系统的设计与实现源码(java毕业设计完整源码).zip
- 异步电动机变频调速系统设计 全文10653个字 详情请看文章 两个仿真+文章+文献+技术
- (175968616)基于ASP网络办公OA系统设计(论文+源代码+开题报告+答辩PPT)
- 基于javaweb驾校理论考试模拟系统论文.doc
- (176039852)粒子群算法解决定点选址问题matlab
- (176099846)上位机与PLC 通讯源码DEMO 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三
- 基于spring和vue的食品厂管理系统源码(java毕业设计完整源码).zip