### 如何书写Makefile #### 概述 Makefile 是一种用于自动化构建过程的脚本文件,在软件开发中尤其重要。它可以自动管理源代码文件之间的依赖关系,并仅重新编译那些真正需要编译的部分,从而极大地提高了软件构建的效率。 #### 关于程序的编译和链接 在计算机编程中,编译和链接是将源代码转换为可执行程序的两个关键步骤。编译器负责将源代码文件转换成目标文件(通常为.o文件),而链接器则将这些目标文件组合成最终的可执行文件。这一过程中可能还会涉及到头文件的预处理等其他任务。 #### Makefile介绍 - **Makefile的规则**:规则定义了如何构建特定的目标文件。它包括依赖项列表以及构建该目标所需的命令。 - **一个示例**:一个简单的Makefile示例可能会包含一个目标`all`,其依赖项为所有的源文件,并且包含一个编译命令。 - **make是如何工作的**:`make`工具通过读取Makefile文件中的规则来决定哪些文件需要被重新编译。它根据文件的时间戳来确定是否需要更新。 - **makefile中使用变量**:变量可以用来存储路径、文件名等,以便在Makefile中重复使用。例如,`CC=gcc`定义了一个名为`CC`的变量,它的值为`gcc`。 - **让make自动推导**:make支持自动推导规则,即根据文件扩展名自动识别并应用相应的编译命令。 - **另类风格的makefile**:除了标准的GNU风格的Makefile之外,还有一些不同的风格,如BSD风格的Makefile。 - **清空目标文件的规则**:通常会有一个`clean`目标,用于删除所有已编译的目标文件和临时文件。 #### Makefile总述 - **Makefile里有什么?** - **显式规则**:明确指定每个目标及其依赖项的规则。 - **隐晦规则**:也称为隐含规则,make工具可以根据文件扩展名自动识别并应用的规则。 - **变量的定义**:用于简化Makefile的编写,使其更加灵活和易于维护。 - **文件指示**:例如`include`指令,用于引入其他Makefile文件。 - **注释**:以`#`开始的行被视为注释,不会被make解释。 - **Makefile的文件名**:通常命名为`Makefile`或`makefile`,但也可以通过命令行指定其他名称。 - **引用其它的Makefile**:使用`include`指令可以引入其他Makefile文件。 - **环境变量MAKEFILES**:虽然不是标准的环境变量,但在某些场景下可能会被用到。 - **make的工作方式**:make读取Makefile中的规则,并根据文件的时间戳来决定哪些文件需要被重新编译。 #### 书写规则 - **规则举例**:一个典型的规则可能看起来像这样: ```make all: prog1 prog2 @echo "Building all programs." ``` - **规则的语法**:由目标、依赖项和命令组成。 - **在规则中使用通配符**:例如,`*.o`表示所有以`.o`结尾的文件。 - **文件搜寻**:make会在多个目录中查找依赖文件。 - **伪目标**:没有对应的文件系统中的文件的目标,常用于执行某些动作,如`clean`或`install`。 - **多目标**:一个规则可以有多个目标。 - **静态模式**:一种特殊的规则类型,用于处理具有相似模式的多个文件。 - **自动生成依赖性**:make可以通过解析源文件自动生成依赖关系。 #### 书写命令 - **显示命令**:显示命令实际上会被执行。 - **命令执行**:命令通常在Shell环境中执行。 - **命令出错**:如果命令执行失败,make会停止执行并返回错误。 - **嵌套执行make**:可以在一个make命令内部再次调用make。 - **定义命令包**:可以定义一组相关的命令,并作为一个整体执行。 #### 使用变量 - **变量的基础**:定义变量的基本语法是`name=value`。 - **变量中的变量**:一个变量可以包含另一个变量的值。 - **变量高级用法**:包括条件赋值、函数等。 - **追加变量值**:允许在原有基础上增加新的值。 - **override指示符**:用于在命令行覆盖Makefile中的变量定义。 - **多行变量**:允许变量跨越多行。 - **环境变量**:Makefile可以访问环境变量。 - **目标变量**:与特定目标关联的变量。 - **模式变量**:与模式规则相关的变量。 #### 使用条件判断 - **示例**:通过条件判断来决定是否执行某个命令。 - **语法**:使用`ifeq`、`ifdef`等条件指令。 #### 使用函数 - **函数的调用语法**:通过`$(function)`来调用函数。 - **字符串处理函数**:如`subst`、`patsubst`等,用于修改字符串。 - **文件名操作函数**:如`dir`、`notdir`等,用于操作文件名。 - **foreach函数**:用于遍历列表。 - **if函数**:用于条件判断。 - **call函数**:用于调用其他函数。 - **origin函数**:用于获取变量的来源。 - **shell函数**:用于执行shell命令。 - **控制make的函数**:如`error`、`warning`等,用于控制make的行为。 #### make的运行 - **make的退出码**:用于指示make执行的结果。 - **指定Makefile**:可以通过命令行指定Makefile文件。 - **指定目标**:例如`make all`、`make clean`等。 - **检查规则**:使用`make -n`或`make -p`来检查Makefile中的规则。 - **make的参数**:例如`-j`指定并行编译的数量。 #### 隐含规则 - **使用隐含规则**:make根据文件扩展名自动选择适当的编译命令。 - **隐含规则一览**:包括C/C++/Pascal等语言的规则。 - **隐含规则使用的变量**:定义了与隐含规则相关的变量。 - **隐含规则链**:一系列隐含规则可以链接在一起。 - **定义模式规则**:一种特殊的规则,用于处理具有相似模式的多个文件。 - **老式风格的"后缀规则"**:一种过时的模式规则。 - **隐含规则搜索算法**:make用来决定使用哪个隐含规则的算法。 #### 使用make更新函数库文件 - **函数库文件的成员**:函数库文件可以包含多个对象文件。 - **函数库成员的隐含规则**:make提供了一组默认的规则来处理函数库文件的更新。 - **函数库文件**:make提供了对函数库文件的支持,包括静态库和共享库。 总结而言,Makefile是一种非常强大的工具,它不仅可以自动化编译和链接过程,还可以通过变量、函数和条件判断等功能来实现更复杂的逻辑。理解和掌握Makefile对于从事软件开发的人来说是非常重要的技能之一。




























- 粉丝: 169
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于UML的高校学生信息综合管理系统设计
- 2018至2019年淘宝女装销售数据集
- 基于Python的洗衣机模糊推理实验系统设计
- 【云原生技术】Podman对比Docker:云原生时代容器管理新选择的优劣势分析与应用实践了云原生
- 【云原生技术】Harvester超融合基础设施详解:云原生时代的企业数据中心与边缘计算解决方案介绍了Harvester
- 【编码译码】基于matlab GUI算术编码译码(含信源 编码模式)【含Matlab源码 13434期】.zip
- 【ZOA三维路径规划】基于matlab斑马算法ZOA多无人机协同三维路径规划【含Matlab源码 13443期】.zip
- 【WSO三维路径规划】基于matlab白鲸算法WSO多无人机协同三维路径规划【含Matlab源码 13441期】.zip
- 【车牌识别】基于matlab GUI模板匹配车牌识别(含识别率)【含Matlab源码 13437期】.zip
- 【滤波跟踪】基于matlab蒙特卡洛算法大机动飞机目标的跟踪滤波技术性能仿真【含Matlab源码 13438期】.zip
- 【双杆】基于matla双杆带锤混沌摆数值模拟【含Matlab源码 13444期】含报告.zip
- 【图像压缩】基于matlab GUI IGS量化图像压缩【含Matlab源码 13446期】.zip
- 【图像加密】基于matlab GUI傅立叶变换和Arnold变换随机图像加密【含Matlab源码 13442期】.zip
- 【元胞自动机】基于matlab元胞自动机人员疏散模拟器【含Matlab源码 13433期】.zip
- C++课程设计:学生综合成绩信息管理平台
- 【云原生领域】Terraform基础设施管理工具详解:重塑云原生时代企业IT架构自动化与优化


