在Linux环境下开发C、C++或其他编译型语言项目时,随着源文件数量增加,手动敲 gcc 命令逐个编译不仅麻烦,还容易遗漏。make 是一个根据文件时间戳自动决定重新编译范围的构建工具,而 Makefile 则是它读取的规则文件。掌握这两者,就能用一条 make 命令完成整个项目的自动化构建。

make与Makefile基础概念
make 工具会读取当前目录下的 Makefile 文件,按照其中定义的目标(target)、依赖(prerequisites)和命令(recipe)来执行构建。其基本逻辑是:如果目标文件不存在,或者依赖文件比目标文件更新,就执行对应命令生成目标。
最简单的Makefile结构
一个基础规则写法如下:
# 目标: 依赖 #<tab>命令 hello: hello.c <tab>gcc -o hello hello.c clean: <tab>rm -f hello
注意命令行前必须是制表符(Tab),不能用空格代替,否则 make 会报错。
如何使用make构建项目
假设我们有如下简单 C 程序,希望通过 Makefile 管理编译。
示例源文件
// main.c
#include <stdio.h>
int main() {
printf("Hello from make!n");
return 0;
}
对应Makefile
CC = gcc TARGET = app SRC = main.c $(TARGET): $(SRC) <tab>$(CC) -o $(TARGET) $(SRC) clean: <tab>rm -f $(TARGET)
在终端执行以下命令即可构建或清理:
- make:根据规则生成 app 可执行文件
- make clean:删除生成的 app
- make -n:只显示将要执行的命令,不真正运行
多文件项目的Makefile写法
当项目包含多个源文件时,可以为每个目标文件编写规则,再由最终目标依赖这些中间文件。
CC = gcc OBJ = main.o util.o TARGET = app $(TARGET): $(OBJ) <tab>$(CC) -o $(TARGET) $(OBJ) main.o: main.c <tab>$(CC) -c main.c util.o: util.c util.h <tab>$(CC) -c util.c clean: <tab>rm -f $(TARGET) $(OBJ)
这样修改某一个 c 文件后,make 只会重新编译受影响的部分,大幅提升效率。
常见内置变量与伪目标
为了避免 clean 等目标与同名文件冲突,通常使用 .PHONY 声明伪目标:
.PHONY: clean clean: <tab>rm -f $(TARGET) $(OBJ)
| 变量 | 含义 |
|---|---|
| $@ | 当前目标名 |
| $^ | 所有依赖文件 |
| $< | 第一个依赖文件 |
合理利用这些自动变量,可以让 Makefile 更简洁通用。
编写 Makefile 时,保持规则清晰、依赖准确,是让 make 稳定工作的关键。
makeMakefileLinux_build修改时间:2026-07-30 02:15:20