理解与编写Makefile指南
"这篇文档是关于如何编写Makefile的指南,由陈皓撰写,祝冬华整理。内容涵盖了Makefile的概述、程序的编译和链接、Makefile的规则、总述、书写规则、命令、变量使用以及条件判断和函数的运用。" Makefile是用于自动化构建项目的工具,特别是在Unix/Linux环境中广泛使用。它定义了如何编译、链接源代码文件以生成可执行程序或库。在Windows环境下,IDE通常会自动处理这些任务,但在命令行环境中,Makefile则是必不可少的。 **第二部分:关于程序的编译和链接** 在Makefile中,编译和链接是通过规则来定义的。规则通常包含目标文件、依赖文件和命令。例如,一个简单的规则可能是将.c文件编译成.o文件,然后链接成最终的可执行文件。 **第三部分:Makefile介绍** - **规则**:规则定义了如何从依赖文件创建目标文件,如`target: dependency ...`,命令紧跟在Tab键后执行。 - **示例**:一个基本的Makefile可能包含`all: main`,表示`main`是默认目标,需要的命令会接着写下来。 - **工作原理**:make会检查目标文件和依赖文件的修改时间,如果依赖文件新于目标文件,就执行命令更新目标。 - **变量**:可以定义变量来存储重复使用的文本,比如`CC = gcc`定义了编译器。 - **自动推导**:make可以自动推导.c文件到.o文件的编译命令。 - **另类风格**:Makefile允许使用不同的格式和结构,但标准做法更易读。 **第四部分:Makefile总述** - **显式规则**:直接定义的规则,如`main: main.o utils.o`. - **隐晦规则**:make内置的规则,如编译C代码。 - **变量定义**:包括全局和局部变量。 - **文件指示**:如`vpath`用于指定查找依赖文件的路径。 - **工作方式**:make可以递归运行,处理多层依赖。 **第五部分:书写规则** - **规则语法**:包括命令行和依赖关系的细节。 - **通配符**:`*`可以匹配任何字符序列。 - **文件搜寻**:`VPATH`环境变量指定搜索路径。 - **伪目标**:如`.PHONY`用于标记不会实际生成的特殊目标。 - **多目标**:一个规则可以生成多个目标。 - **静态模式**:用于批量处理类似任务。 - **自动生成依赖性**:利用`-M`选项让编译器生成依赖性信息。 **第六部分:书写命令** - **显示命令**:`@`前缀使命令不显示在终端。 - **执行**:命令在shell中运行。 - **错误处理**:如果命令失败,make可以停止或者继续执行。 - **嵌套make**:可以在一个Makefile中调用另一个Makefile。 - **命令包**:`$(cmd)`用于执行命令并捕获其输出。 **第七部分:使用变量** - **基础**:变量赋值,如`FOO = bar`。 - **变量中的变量**:可以嵌套使用,如`BAR = $(FOO)`. - **高级用法**:如函数运算和扩展。 - **追加值**:使用`+=`来追加值到变量。 - **override指示符**:覆盖Makefile外部的环境变量。 - **多行变量**:使用反斜杠(\)来跨越多行。 **第八部分:使用条件判断** - **示例**:根据条件选择执行不同的代码块。 - **语法**:如`ifeq (var1, var2)`进行比较。 **第九部分:使用函数** - **调用语法**:函数名后跟参数,如`$(func arg1 arg2)`。 - **字符串处理**:如`substr`, `patsubst`, `strip`等用于字符串操作。 - **文件名操作**:如`dir`和`notdir`获取路径和文件名。 Makefile的灵活性和强大功能使其成为软件项目构建的关键工具,理解和熟练使用Makefile能够极大地提高开发效率。
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![m](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://profile-avatar.csdnimg.cn/eec44344716a41008c0ff8a6c152724f_zqlite.jpg!1)
- 粉丝: 21
- 资源: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决Eclipse配置与导入Java工程常见问题
- 真空发生器:工作原理与抽吸性能分析
- 爱立信RBS6201开站流程详解
- 电脑开机声音解析:故障诊断指南
- JAVA实现贪吃蛇游戏
- 模糊神经网络实现与自学习能力探索
- PID型模糊神经网络控制器设计与学习算法
- 模糊神经网络在自适应PID控制器中的应用
- C++实现的学生成绩管理系统设计
- 802.1D STP 实现与优化:二层交换机中的生成树协议
- 解决Windows无法完成SD卡格式化的九种方法
- 软件测试方法:Beta与Alpha测试详解
- 软件测试周期详解:从需求分析到维护测试
- CMMI模型详解:软件企业能力提升的关键
- 移动Web开发框架选择:jQueryMobile、jQTouch、SenchaTouch对比
- Java程序设计试题与复习指南
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)