### 跟我一起学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币余额
我的收藏
我的下载
下载帮助


最新资源
- 2023年秋福师计算机组成原理在线作业一.doc
- 2023年秋福师计算机应用基础在线作业一.doc
- 2023年秋福师数据库应用在线作业二.doc
- 2023年秋福师面向对象的程序设计在线作业一答案.doc
- 2023年秋华中师范大学C语言程序设计B在线作业.doc
- 2023年秋华中师范大学数据库管理在线作业.doc
- 2023年秋季华中师范大学计算机基础在线作业.doc
- 2023年秋季华中师范大学数据库管理在线作业.doc
- 2023年秋季华中师范大学微机系统与接口技术在线作业.doc
- 2023年秋西交程序设计综合训练在线作业.doc
- 2023年人民银行招聘考试计算机专项练习新版.doc
- 2023年上半年计算机等级考试VFP二级笔试试卷及答案.doc
- 2023年硕士研究生入学考试计算机统考试题参考答案.doc
- 2023年上半年软考网络工程师上午试卷及解析.doc
- 2023年西昌市教师考试计算机预测题及解析.doc
- 2023年系统集成项目管理工程师题库难.doc


