Makefile入门

Makefile是一个定义编译规则的文件,用于自动化构建项目。它的工作流程包括读取、初始化变量、建立依赖关系链表,并根据目标文件的更新情况执行相应的编译命令。例如,一个简单的Makefile可以管理单个或多个源文件,通过'.c'到'.o'再到可执行文件的转换。使用'wildcard'函数,可以动态获取当前目录下的所有.c文件,简化多文件项目的构建规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Makefile是什么

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。

2、Makefile如何工作

在默认的方式下,在当前目录执行make命令。那么,
1、make自动寻找“Makefile”文件

2、依次读取工作目录makefile文件中使用指示符“include”包含的文件

3、查找重建所有已读取的makefile文件的规则(如果存在一个目标是当前读取的某一个makefile文件,则执行此规则重建此makefile文件,完成以后从第一步开始重新执行)

4、 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支

5、根据“终极目标”以及其他目标的依赖关系建立依赖关系链表

6、 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)

7、执行“终极目标”所在的规则

注意
1、 可以使用以下方式手动指定Makefile文件
make -f 文件名
2、可以使用以下方式手动指定目标
make [target]

2、Makefile简单示例

1、单文件:main.c main.h

## 编译和链接main.c文件,生成可执行文件test
cc test.c -o test

2、多文件:main.c work.c main.h work.h

## 编译.c文件,生成.o链接文件
cc main.c -c main.o
cc work.c -c work.o
## .o文件链接,生成可执行文件test
cc -o test main.o work.o

3、多文件:*.c *.h

“wildcard”,用法:$(wildcard PATTERN…)
在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表

## 目标名
TARGETS = test
## 获取当前目录所有.c文件
SRC     := $(wildcard *.c)
## 获取当前目录所有.c文件对应的.o文件
OBJ     := $(SRC:.c=.o)
## 目标:依赖
$(TARGETS) : $(OBJ)
	cc $(OBJ) -o $(TARGETS)
## 目标:.c编译生成对应.o文件
%.o : %.c
	cc -c $(SRC)

“$@”,目标文件
“$^” ,所有的依赖文件
“$<”, 第一个依赖文件
因此,以上Makefile也可以写成以下方式

TARGETS = test
SRC     := $(wildcard *.c)
OBJ     := $(SRC:.c=.o)
$(TARGETS) : $(OBJ)
	cc $^ -o $@
## .c.o 等价 %o:%c
.c.o:
	cc -c $<