python环境搭建 (六) Makefile 简单使用方法

Makefile 简单使用方法

Makefile 是自动化构建工具 ,核心作用是定义项目的构建规则、依赖关系和执行命令,通过 make 命令自动执行,替代手动重复敲编译/运行/清理等指令,大幅提升开发效率,尤其适合C/C++项目,也可用于Python/Go等各类项目的自动化流程管理。

一、Makefile 核心规则(最基础、最核心)

Makefile 的核心是规则 ,一个规则对应一个构建目标,基本格式固定,命令行前必须用 Tab 键缩进(空格会报错,这是最常见的坑):

makefile 复制代码
# 格式:目标: 依赖文件/依赖目标
# 	    执行的命令(Tab 开头,可多行)
目标(target): 依赖(dependencies)
	命令1(shell 命令均可,如gcc、rm、python等)
	命令2
  • 目标:要生成的文件(如可执行文件、目标文件)或「伪目标」(如clean、run,无实际文件生成);
  • 依赖:生成目标所需的文件/其他目标(如编译可执行文件需要的.c源文件);
  • 命令:从依赖生成目标的shell指令,按顺序执行。

二、最简入门示例(编译单个C文件)

以编译C文件 main.c 生成可执行文件 app 为例,创建名为 Makefile(或 makefile,首字母大小写均可)的文件,内容如下:

makefile 复制代码
# 最简Makefile:生成可执行文件app
app: main.c
	gcc main.c -o app  # Tab 开头,编译命令

# 清理目标:删除生成的可执行文件
clean:
	rm -f app  # -f 强制删除,避免文件不存在时报错
执行命令(终端在Makefile同级目录)
bash 复制代码
make        # 执行第一个目标(app),自动编译
make clean  # 执行clean目标,清理生成的文件

三、核心实用特性(简单易上手)

1. 伪目标(.PHONY):避免与同名文件冲突

如果目录下有个文件叫 clean,直接执行 make clean 会失效,用 .PHONY 声明「伪目标」,表示这不是实际要生成的文件,强制执行命令:

makefile 复制代码
.PHONY: clean  # 声明clean为伪目标
app: main.c
	gcc main.c -o app
clean:
	rm -f app

常用伪目标all(构建所有目标)、clean(清理)、run(运行程序)、install(安装)。

2. 变量:简化重复代码,方便统一修改

定义变量后用 $(变量名) 引用,适合重复使用的内容(如编译器、编译参数、源文件),修改一处即可全局生效:

makefile 复制代码
.PHONY: clean run
CC = gcc        # 定义编译器变量
CFLAGS = -Wall  # 编译参数(-Wall 显示所有警告)
TARGET = app    # 可执行文件名称
SRC = main.c    # 源文件

# 引用变量,简化规则
$(TARGET): $(SRC)
	$(CC) $(SRC) -o $(TARGET) $(CFLAGS)

run: $(TARGET)  # 运行目标,依赖app(先编译再运行)
	./$(TARGET)

clean:
	rm -f $(TARGET)

执行 make run,会自动先编译 app,再运行 ./app

3. 多目标/多依赖:适配多个源文件的场景

如果项目有 main.cfunc.c 两个源文件,直接将多个依赖写在目标后即可:

makefile 复制代码
.PHONY: clean
CC = gcc
TARGET = app
# 多依赖:生成app需要main.c和func.c
$(TARGET): main.c func.c
	$(CC) main.c func.c -o $(TARGET)
clean:
	rm -f $(TARGET)
4. 默认目标:Makefile 第一个目标

make 命令不加任何参数时,会自动执行第一个目标 ,通常用 all 作为第一个目标,指定要构建的所有核心目标:

makefile 复制代码
.PHONY: all clean run  # all作为第一个目标,成为默认目标
all: app  # all依赖app,执行make即执行make all,编译app

CC = gcc
TARGET = app
SRC = main.c
$(TARGET): $(SRC)
	$(CC) $(SRC) -o $(TARGET)
run: $(TARGET)
	./$(TARGET)
clean:
	rm -f $(TARGET)

四、稍完整的实用示例(覆盖核心用法)

整合变量、伪目标、多依赖、运行/清理,适合大部分小型项目:

makefile 复制代码
# 声明伪目标:all(默认)、clean(清理)、run(运行)
.PHONY: all clean run
# 定义变量:编译器、参数、目标文件、所有源文件
CC = gcc
CFLAGS = -Wall -g  # -g 生成调试信息,方便gdb调试
TARGET = myapp
# 所有源文件(多个用空格分隔)
SRC = main.c func.c tool.c

# 默认目标:构建可执行文件
all: $(TARGET)

# 构建规则:多源文件编译
$(TARGET): $(SRC)
	@echo "开始编译..."  # @echo 执行时不显示命令本身,只显示输出
	$(CC) $(SRC) -o $(TARGET) $(CFLAGS)
	@echo "编译完成!生成文件:$(TARGET)"

# 运行程序:先编译再运行
run: $(TARGET)
	@echo "运行程序:"
	./$(TARGET)

# 清理生成的文件
clean:
	@echo "清理文件..."
	rm -f $(TARGET)
	@echo "清理完成"
执行命令
bash 复制代码
make        # 编译(默认执行all)
make run    # 编译+运行
make clean  # 清理

五、关键使用要点

  1. 命令行前必须用 Tab 缩进,不能用空格(编辑器需关闭「Tab自动转空格」);
  2. 注释用 # 开头,单行注释;
  3. 执行命令时,加 @ 可隐藏命令本身(如 @echo 只显示输出,不显示echo 开始编译...);
  4. Makefile 会自动检查依赖文件的修改时间:如果依赖文件(如.c)比目标文件(如可执行文件)新,才会重新编译,否则跳过(节省构建时间)。

六、核心总结

  1. Makefile 核心是规则(目标:依赖 + Tab命令),用于定义自动化构建流程;
  2. 必学特性:Tab 缩进、伪目标(.PHONY)、变量($(变量))、默认目标(第一个);
  3. 常用命令:make(执行默认目标)、make 目标名(执行指定目标,如make clean/run);
  4. 核心价值:替代手动重复指令,自动检查文件修改、按需构建,适合所有需要重复执行固定流程的项目。
相关推荐
重生之后端学习2 小时前
146. LRU 缓存
java·数据结构·算法·leetcode·职场和发展
萧曵 丶2 小时前
懒加载单例模式中DCL方式和原理解析
java·开发语言·单例模式·dcl
深圳市恒讯科技2 小时前
2026新加坡服务器配置全攻略:SSL证书、硬件防火墙与CDN加速
运维·服务器·ssl
回忆是昨天里的海2 小时前
k8s部署的微服务动态扩容
java·运维·kubernetes
萧曵 丶2 小时前
单例模式 7 种实现方式对比表
java·单例模式
lang201509282 小时前
Tomcat Maven插件全解析:开发部署一体化
java·tomcat·maven
IT北辰2 小时前
基于Vue3+python+mysql8.0的财务凭证录入系统,前后端分离完整版(可赠送源码)
python·vue
JHC_binge2 小时前
国内Ubuntu 22.04 LTS安装Milvus向量数据库
java·linux·ubuntu
墨染青竹梦悠然2 小时前
基于Django+vue的图书借阅管理系统
前端·vue.js·后端·python·django·毕业设计·毕设