从零到精通:一站式指南——Makefile 使用解析
51 浏览量
更新于2024-08-29
收藏 79KB PDF 举报
本文主要介绍了make工具及其使用,特别是如何编写通用的Makefile,适合初学者学习。
在软件开发过程中,`make` 是一个非常重要的自动化构建工具,它能够根据源文件之间的依赖关系自动编译和链接项目。通过读取名为 `Makefile` 的配置文件,`make` 可以理解哪些文件需要重新编译,从而极大地提高了开发效率。
1、**Makefile**
Makefile 是一个包含了编译规则和依赖关系的文本文件,告诉 `make` 如何构建项目。它定义了目标(通常是可执行文件或目标文件)及其依赖项,以及当依赖项发生变化时应执行的命令。
2、**Makefile基本规则**
Makefile 的基本结构是:
```
target: dependencies
command
```
- `target` 是要创建或更新的文件,如可执行文件。
- `dependencies` 是目标文件依赖的其他文件,如源代码文件或头文件。
- `command` 是当依赖文件更新时,`make` 需要执行的命令,通常用于编译和链接操作。每个命令前面必须有一个TAB键,而非多个空格。
3、**最简单的Makefile例子**
以下是一个简单的Makefile示例,假设项目包含 `main.c`, `add.c`, `add.h`, `sub.c`, `sub.h` 这些文件:
```make
main: main.o add.o sub.o
gcc main.o add.o sub.o -o main
main.o: main.c add.h sub.h
gcc -c main.c -o main.o
add.o: add.c add.h
gcc -c add.c -o add.o
sub.o: sub.c
gcc -c sub.c -o sub.o
```
这个Makefile定义了 `main` 目标,它依赖于 `main.o`, `add.o`, `sub.o`。每种 `.o` 文件又各自依赖相应的 `.c` 和 `.h` 文件。当`.c` 或 `.h` 文件改变时,对应的 `.o` 文件将被重新编译。
4、**Makefile中的变量**
Makefile 支持变量,可以用来减少重复和提高可读性。例如,可以定义一个变量 `CC` 代表编译器,然后在命令中使用:
```make
CC = gcc
CFLAGS = -c -Wall
%.o: %.c
$(CC) $(CFLAGS) $< -o $@
```
5、**自动推导规则**
`make` 自动推导规则意味着它知道大多数情况下 `.c` 文件如何编译成 `.o` 文件,以及如何将 `.o` 文件链接成可执行文件。因此,上面的Makefile可以通过自动推导规则简化:
```make
CC = gcc
CFLAGS = -c -Wall
OBJS = main.o add.o sub.o
main: $(OBJS)
$(CC) $(OBJS) -o main
```
6、**伪目标**
伪目标(如 `.PHONY`)用于标记那些实际上并不对应任何文件的目标,比如 `clean`,用于清理编译过程生成的临时文件:
```make
.PHONY: clean
clean:
rm -f *.o main
```
7、**多级目录Makefile**
对于包含多个子目录的项目,可以在每个子目录下都有自己的Makefile,或者在顶层Makefile中管理所有子目录。
8、**Makefile中的函数**
Makefile 支持多种内建函数,如 `$(wildcard)` 获取所有匹配模式的文件,`$(patsubst)` 替换模式等,使得Makefile更具灵活性。
9、**最终通用Makefile**
一个通用的Makefile通常会处理不同类型的文件和编译选项,支持多平台,并且易于扩展和维护,适合大型项目。
总结,掌握 `make` 和编写 `Makefile` 是每个开发者的基本技能,它能帮助我们有效地管理和构建项目,节省时间和精力。通过理解上述知识点,你可以开始编写自己的通用Makefile,适应各种C/C++项目的需求。
169 浏览量
309 浏览量
221 浏览量
163 浏览量
点击了解资源详情
323 浏览量
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38606870
- 粉丝: 1
- 资源: 922
最新资源
- kindergarten
- 基于VB实现ACCESS汽车租凭管理系统(论文+系统).rar
- 软件测试工程师面试题及答案(全)文档集
- 最好用的JAVA代码混淆工具proguard-7.0.0.zip
- mixlib-cli:用于创建命令行应用程序的混合-为参数说明和处理提供了简单的DSL
- Flutter_Localizations:一个示例flutter应用程序,演示了如何使用本地化来支持2种语言
- 自平衡智能小车第二版-电路方案
- zstack.zip
- 基于MATLAB的遗传算法工具箱(51个MATLAB工具+源代码).zip
- Weights-Initialization-in-Nueral-Networks:神经网络中的权重初始化技术
- 20200917-头豹研究院-汽车应用系列深度研究:2019年中国经营性汽车租赁行业应用概览.rar
- CICD_automation
- 变频器 SINAMICS G120D,配备控制单元 CU240D-2.zip
- 耶鲁大学人脸识别数据集
- sinatra-book:正式回购到sinatrasinatra-book教程+食谱
- DFRobot_DS323X