### Make工具核心知识点详解 #### 一、Make工具概述与基本使用 **1.1 概述** Make 是一种自动化构建工具,广泛应用于软件工程领域,用于自动化编译和链接程序。通过创建 Makefile 文件来定义项目的构建逻辑,Make 能够自动检测源文件的变化并重新构建受影响的部分,从而提高开发效率。 **1.2 准备知识** - **基础知识**:熟悉基本的 shell 命令。 - **概念理解**:理解依赖关系和目标的概念。 - **工具安装**:确保已安装 GNU make。 #### 二、Makefile 文件详解 **2.1 Makefile 简介** Makefile 是一个文本文件,其中包含了 Make 执行的一系列指令和规则。它是 Make 工具的核心配置文件。 **2.2 Makefile 规则介绍** - **规则格式**:`target: prerequisites` `command` - **目标(target)**:需要构建的目标文件。 - **先决条件(prerequisites)**:构建目标所需的文件。 - **命令(command)**:执行的具体命令。 **2.3 简单示例** 假设有一个简单的 C 语言项目,包含两个源文件 `main.c` 和 `util.c`: ```makefile all: main.o util.o gcc -o myapp main.o util.o main.o: main.c gcc -c main.c util.o: util.c gcc -c util.c ``` **2.4 Make 如何工作** - **依赖检查**:Make 首先检查目标文件与先决条件文件的时间戳。 - **命令执行**:如果目标比先决条件旧,则执行对应的命令。 **2.5 指定变量** - **变量定义**:`VARIABLE=value` 或 `VARIABLE := value` - **变量使用**:`$(VARIABLE)` 或 `${VARIABLE}` 例如: ```makefile CC=gcc CFLAGS=-Wall all: main.o util.o $(CC) $(CFLAGS) -o myapp main.o util.o ``` **2.6 自动推导规则** Make 支持内置的自动规则,如 `.c.o` 规则,用于编译 C 语言源文件。 **2.7 另类风格的 Makefile** - **模式规则**:使用 `%` 作为通配符,匹配多个目标。 - **模式规则示例**: ```makefile %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` **2.8 清除工作目录过程文件** - **使用 `.PHONY`**:指定一个目标为虚拟目标。 - **清除规则示例**: ```makefile clean: rm -f *.o myapp ``` #### 三、Makefile 总述 **3.1 Makefile 的内容** - **目标**:最终需要构建的对象。 - **规则**:定义如何构建目标。 - **变量**:简化 Makefile 编写。 **3.2 makefile 文件的命名** 通常命名为 `Makefile` 或 `makefile`。 **3.3 包含其它 makefile 文件** - **`include` 指令**:将其他 Makefile 文件包含进来。 - **示例**: ```makefile include common.mk ``` **3.4 变量 MAKEFILES** 该变量包含了 Make 加载的所有 Makefile 文件的列表。 **3.5 变量 MAKEFILE_LIST** 与 `MAKEFILES` 类似,存储了 Make 加载的文件列表。 **3.6 其他特殊变量** - **`$@`**:目标文件名称。 - **`$^`**:所有先决条件的列表。 - **`$<`**:第一个先决条件文件的名称。 **3.7 Makefile 文件的重建** 如果 Makefile 文件本身发生了变化,可以通过运行 `make` 命令重新构建整个项目。 **3.8 重载另一个 Makefile** 可以使用 `make -f <Makefile>` 来指定不同的 Makefile 文件。 **3.9 Make 如何解析 Makefile 文件** - **变量取值**:Make 会根据变量定义的顺序来解析和展开变量。 - **条件语句**:使用 `ifeq`, `ifdef` 等条件结构。 - **规则定义**:定义如何构建目标。 #### 四、Makefile 的规则 **4.1 规则语法** 规则的基本语法如下: ```makefile target: prerequisites command ``` **4.2 依赖的类型** - **显式依赖**:直接列出的依赖项。 - **隐式依赖**:Make 内置的规则。 - **次序依赖**:通过 `||` 分隔的依赖项。 **4.3 文件名使用通配符** - **通配符使用**:如 `*` 和 `?`。 - **`wildcard` 函数**:返回匹配的文件列表。 **4.4 目录搜寻** - **VPATH**:定义搜索路径。 - **vpath**:针对特定文件的搜索路径。 **4.5 Makefile 伪目标** - **`.PHONY`**:标记目标为虚拟目标。 - **用途**:通常用于清理操作。 **4.6 强制目标** 无命令或依赖的目标,用于触发某个动作。 **4.7 空目标文件** 仅包含命令的目标,不依赖于任何文件。 **4.8 Makefile 的特殊目标** - **`.SUFFIXES`**:指定后缀转换规则。 - **`.PRECIOUS`**:保护文件不被删除。 - **`.SECONDARY`**:次级目标。 **4.9 多目标** 一个规则可以有多个目标。 **4.10 多规则目标** 一个目标可以有多个规则。 **4.11 静态模式** - **静态模式规则**:支持通配符 `%`。 - **语法**:`target_pattern: prerequisite_pattern` `command` **4.12 双冒号规则** 用于定义多重规则。 **4.13 自动产生依赖** - **`-M` 选项**:生成依赖关系。 - **`-MM` 选项**:只生成依赖关系,不执行命令。 #### 五、规则的命令 **5.1 命令回显** 通过 `-n` 选项可以显示将要执行的命令而不实际执行。 **5.2 命令的执行** - **shell 命令**:默认在 shell 中执行。 - **直接执行**:使用 `$(shell command)` 直接执行命令。 **5.3 并发执行命令** - **`-j` 选项**:指定并发执行的进程数。 - **注意事项**:需谨慎使用以避免资源冲突。 **5.4 命令执行的错误** - **退出状态**:非零表示失败。 - **`-k` 选项**:即使遇到错误也继续执行。 **5.5 中断 make 的执行** - **`-q` 选项**:仅检查是否需要更新。 - **`-s` 选项**:静默模式,减少输出。 **5.6 make 的递归执行** - **递归调用**:在 Makefile 中调用 `make`。 - **递归选项**:使用变量 `MAKE` 来控制递归行为。 **5.7 定义命令包** 通过定义宏来封装一系列命令。 **5.8 空命令** 空命令用于定义一个规则但不执行任何操作。 #### 六、Makefile 中的变量 **6.1 变量的引用** - **引用方式**:`$(variable)` 或 `${variable}`。 **6.2 两种变量定义** - **递归展开式变量**:`VARIABLE=value`。 - **直接展开式变量**:`VARIABLE := value`。 **6.3 变量的高级用法** - **变量替换**:使用 `$(var:pattern=replacement)` 替换变量值中的模式。 - **变量套嵌**:变量内部可以嵌套引用其他变量。 **6.4 变量取值** - **`$(origin variable)`**:获取变量的定义方式。 - **`$(value variable)`**:获取变量的值。 **6.5 如何设置变量** - **环境变量**:在命令行中设置。 - **Makefile 内定义**:直接在 Makefile 中定义。 **6.6 追加变量值** - **`+=` 运算符**:向变量追加值。 **6.7 override 指示符** 允许在命令行或 Makefile 中覆盖变量。 **6.8 多行定义** - **`\`**:用于续行。 **6.9 系统环境变量** - **`$(shell echo $VARIABLE)`**:获取系统环境变量的值。 **6.10 目标指定变量** - **`$(VARNAME:target=override)`**:为目标特定的变量设置值。 **6.11 模式指定变量** - **`$(VARNAME:pattern=override)`**:为模式匹配的目标设置变量值。 #### 七、Makefile 的条件执行 **7.1 一个例子** 示例: ```makefile ifeq ($(OS),Windows_NT) CC=gcc else CC=clang endif ``` **7.2 条件判断的基本语法** - **`ifeq`**:相等时执行。 - **`ifdef`**:变量定义时执行。 - **`ifneq`**:不相等时执行。 **7.3 标记测试的条件语句** 使用 `!=` 运算符进行条件测试。 #### 八、make 的内嵌函数 **8.1 函数的调用语法** - **调用方式**:`$(function(arg1, arg2))`。 **8.2 文本处理函数** - **`$(subst FROM,TO,TEXT)`**:字符串替换。 - **`$(patsubst PATTERN,REPLACEMENT,TEXT)`**:模式替换。 - **`$(strip STRINT)`**:去除空白字符。 - **`$(findstring FIND,IN)`**:查找子串。 - **`$(filter PATTERN…,TEXT)`**:过滤匹配项。 - **`$(filter-out PATTERN,TEXT)`**:过滤不匹配项。 - **`$(sort LIST)`**:排序。 - **`$(word N,TEXT)`**:提取第 N 个单词。 - **`$(wordlist S,E,TEXT)`**:提取指定范围内的单词列表。 - **`$(words TEXT)`**:计算单词数。 - **`$(firstword TEXT)`**:提取第一个单词。 - **`$(lastword TEXT)`**:提取最后一个单词。 - **`$(notdir FILE)`**:去除路径,保留文件名。 - **`$(basename FILE)`**:去除扩展名。 - **`$(suffix FILE)`**:获取文件扩展名。 - **`$(dir FILE)`**:去除文件名,保留路径。 - **`$(addprefix PREFIX,LIST)`**:添加前缀。 - **`$(addsuffix SUFFIX,LIST)`**:添加后缀。 - **`$(join LIST1,LIST2)`**:连接两个列表。 - **`$(wildcard PATTERN)`**:匹配文件列表。 以上是基于给定文件中的知识点摘要和详细解释。通过这些内容,读者可以对 Make 工具及其 Makefile 文件的编写有较为全面的理解。




























剩余198页未读,继续阅读


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


最新资源
- 软件测评技术咨询合同.docx
- 新疆美食汇网络营销策划案例.doc
- 计算机基础试题征集.doc
- 中药滴丸自动化包装车间实时监控系统——底层主控单元的研究与开发的开题报告.docx
- 找人做个微信网站方案.doc
- 中位物联网大数据平台总体设计V1.0.doc
- com.intsig.camscanner.apk
- 内部办公软件运营方案.docx
- 预算基础知识及软件操作分享.pptx
- 机械设计制造及其自动化专业课程设计任务计划书.docx
- 网络营销考核性作业.docx
- 全国一级计算机基础及MS-Office应用课件2016版.ppt
- 实验一——Linux环境下的进程管理(1).doc
- 进行网络营销手段多样化-入门先从SEO开始.doc
- 某软件有限公司文档版本管理规范.docx
- CAD快捷键命令大全-超全-.xls


