递归编译C文件的Makefile工具使用教程
需积分: 5 141 浏览量
更新于2024-10-25
收藏 8KB ZIP 举报
资源摘要信息:"makefile_test_plus.zip"
在本节内容中,我们将深入探讨makefile的使用方法,特别是当需要编译多文件目录中的C语言源文件时。makefile是一个广泛使用的自动化编译工具,它读取名为Makefile或makefile的文件,该文件包含了构建项目的指令。通过Makefile,可以有效地控制复杂的编译过程,比如只重新编译那些自上次编译后修改过的源文件,或者使用特定的编译选项编译项目中的不同部分。
makefile_test_plus.zip文件中包含的makefile可以实现对多文件目录下所有C文件的递归编译,并能够遍历文件夹,这意味着它不仅限于当前目录,还可以递归地查找所有子目录中的C文件并进行编译。
以下是Makefile文件中常见的知识点和相关指令:
1. Makefile的基本结构:
- 规则(Rule):规则由目标(target)、依赖(dependencies)和命令(commands)组成。
- 目标(Target):通常是编译生成的文件名,比如可执行文件或目标文件。
- 依赖(Dependencies):目标文件生成所依赖的文件,比如源文件或头文件。
- 命令(Commands):用于创建目标文件的具体命令,需要以Tab键开始。
2. 伪目标(Phony Targets):
- 伪目标不对应实际的文件名,它用来执行某种操作,例如clean通常用于清理编译生成的文件。
3. 变量(Variables):
- 变量用于简化Makefile,可以定义编译器、编译选项、源文件列表等。
- 变量通常以大写字母命名。
4. 模式规则(Pattern Rules):
- 模式规则允许使用通配符来定义一系列相似的规则,这样可以减少重复代码。
- 模式规则使用%表示匹配任意数量的字符。
5. 函数(Functions):
- Makefile提供了许多内置函数,如wildcard可以获取匹配指定模式的文件列表。
6. 递归Makefile(Recursive Makefiles):
- 当项目包含多个子目录,且每个目录都有自己的Makefile时,可以在顶层Makefile中调用make命令来编译这些子目录。
7. 条件语句(Conditional Directives):
- 条件语句可以根据不同的条件执行不同的Makefile指令,例如判断某个变量是否被定义。
8. Makefile的扩展:
- Makefile可以通过include指令引入其他Makefile文件。
9. make的命令行选项:
- 例如make -jN允许并行编译,提高编译速度(其中N是并行任务的数量)。
针对makefile_test_plus.zip文件描述中提到的功能,以下是可能用到的Makefile指令:
```makefile
# 定义编译器变量
CC=gcc
# 定义编译选项变量
CFLAGS=-Iinclude -Wall
# 定义目标文件变量
TARGET=executable
# 定义所有源文件的模式
SRCS=$(wildcard *.c)
OBJS=$(patsubst %.c,%.o,$(SRCS))
# 默认目标规则
all: $(TARGET)
# 指定可执行文件名作为目标
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
# 对应C文件到.o文件的规则
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
# 伪目标:清理编译生成的文件
clean:
rm -f $(OBJS) $(TARGET)
# 递归遍历文件夹
SUBDIRS=$(shell find . -type d -name "*")
SUBMAKE=$(foreach dir,$(SUBDIRS),$(MAKE) -C $(dir) $(MAKECMDGOALS))
.PHONY: $(SUBDIRS) $(SUBMAKE)
# 在顶层Makefile中递归执行子目录的make命令
.PHONY: all
all: $(SUBMAKE)
```
在上述示例Makefile中,`$(wildcard *.c)`用于获取当前目录下的所有.c文件。`$(patsubst %.c,%.o,$(SRCS))`将.c文件名替换为.o文件名。`%.o: %.c`模式规则定义了如何将C源文件编译成目标文件。而`$(SUBDIRS)`和`$(SUBMAKE)`则用于在顶层Makefile中遍历并执行子目录中的Makefile。`$(MAKECMDGOALS)`变量用于在递归调用时保留用户输入的目标。
理解并能够灵活使用这些知识点,可以帮助我们在管理复杂的项目时有效地编译代码,并能够方便地增加、删除或修改文件,而无需手动重新编译整个项目。
211 浏览量
点击了解资源详情
点击了解资源详情
214 浏览量
2024-09-08 上传
2023-04-05 上传
2014-12-16 上传
116 浏览量
2023-04-13 上传
Wang20122013
- 粉丝: 82
- 资源: 13
最新资源
- cra-ts-prettier-commitlint-template:CRA模板,具有更漂亮,更沙哑,更出色的提交以及更多现成的设置
- portfolio-template:Jekyll产品组合网站模板,以使用GitHub Pages展示您的工作
- 供应链管理中的库存控制
- jsonviewerpackage.zip
- johnroids:Johnroids是在go,gopherjs和gowasm中实现的旧式小行星游戏
- localSolver:本地求解器的文件。 云托管代码不需要这些
- 供应链管理 供应链管理思想产生
- XCTAssertCrash:使用Mach异常处理程序或POSIX信号处理程序断言表达式崩溃
- kutik
- 47元手把手教你:图像识别的垃圾分类系统.rar
- gp_project:使用遗传编程找到多项式函数
- qrcode_scanner::hammer_and_wrench:Flutter QR码扫描仪插件
- 美赛各题型常见参考代码汇总.zip
- 供应链下的后勤管理
- 7Bot-Arduino-lib:这是7Bot的Arduino库
- 5.9【阿里云天池】零基础入门数据价格:二手车交易价格预测 car-price-forecast-master.zip