当前位置: 首页 > news >正文

Makefile极简指南

一、Makefile 核心逻辑

每个 Makefile 的规则都遵循「目标 - 依赖 - 命令」的核心结构,这是 Makefile 的灵魂:

 
目标: 依赖
命令 # 关键:命令前必须是【Tab键】,不能用空格!
  • 目标:要生成的文件(如 app.exemain.o、嵌入式固件 firmware.elf)或要执行的动作(如 clean);
  • 依赖:生成目标必需的文件(如 main.cadd.o)或其他目标;
  • 命令:从依赖生成目标的具体步骤(如编译器命令 gcc)。

二、入门实操:从单个文件到多文件

1. 第一步:单个文件编译(最简场景)

项目结构
 
project/
├── main.c # 核心代码(含 main() 函数)
└── Makefile # 构建脚本(首字母大小写均可,无后缀)
基础版本(直接编译)
 
# 目标:生成 app.exe;依赖:main.c
app.exe: main.c
# 编译命令:将 main.c 生成 app.exe
gcc -o app.exe main.c
优化版本(使用变量,便于维护)

定义变量后,后续更换工具链(如嵌入式交叉编译器)时,仅需修改变量,无需改动命令:

 
CC = gcc # 编译器变量
# 目标:依赖
app.exe: main.c
# 变量引用语法:$(变量名)
$(CC) -o app.exe main.c

在命令行输入make即可生成app.exe可执行文件。

2. 第二步:多文件编译

当项目拆分多个源文件(如主程序、驱动、工具函数)时,用 .o 中间文件做依赖,支持增量编译(仅重新编译修改的文件)。

项目结构
 
project/
├── main.c # 主程序(调用加法函数)
├── add.c # 加法函数实现
├── add.h # 加法函数声明(头文件)
└── Makefile
基础版本
 
CC = gcc
# 最终目标:链接所有 .o 文件生成可执行程序
app.exe: main.o add.o
$(CC) -o app.exe main.o add.o # 链接命令
# 中间目标:.c 文件编译为 .o 文件(-c:只编译不链接)
main.o: main.c add.h # main.c 依赖 add.h(需包含函数声明)
$(CC) -c main.c
add.o: add.c add.h
$(CC) -c add.c
# 清理目标:删除编译产物
.PHONY: clean # 声明为伪目标,避免目录有clean文件时命令失效
clean:
rm -f main.o add.o app.exe # Linux/macOS
# del main.o add.o app.exe # Windows 需替换为这行

在命令行输入make即可生成app.exe可执行文件,输入make clean即可清理编译过程中生成的中间文件

增量编译优势
  • 仅修改 add.c 时,make 自动检测依赖变化,仅重新编译 add.o,再链接生成 app.exe,无需编译 main.o,节省时间;
  • 手动删除某个 .o 文件(如 main.o),make 会自动重新编译该文件。

3. 第三步:模式规则 + 自动变量(简化代码)

上面的多文件 Makefile 中,每个 .o 文件的编译命令重复($(CC) -c XXX.c),可用「模式规则」和「自动变量」简化,新增文件时无需修改规则。

优化版本(嵌入式推荐)
 
CC = gcc # 编译器
OBJS = main.o add.o # 所有中间 .o 文件(新增文件仅需添加此处)
TARGET = app.exe # 最终目标文件名(统一管理,便于修改)
# 最终目标:链接所有依赖的 .o 文件
$(TARGET): $(OBJS)
$(CC) -o $@ $^ # 自动变量:$@=目标名,$^=所有依赖
# 模式规则:所有 .c 文件自动生成对应的 .o 文件(替代重复规则)
%.o: %.c
$(CC) -c $< -o $@ # 自动变量:$<=第一个依赖(即 .c 文件),$@=目标(即 .o 文件)
# 清理目标
.PHONY: clean # 声明为伪目标,避免目录有clean文件时命令失效
clean:
rm -f $(OBJS) $(TARGET) # Linux/macOS
# del $(OBJS) $(TARGET) # Windows 替换
核心自动变量(必记)
自动变量含义示例
$@当前目标文件名编译 add.o 时,$@=add.o;链接 app.exe 时,$@=app.exe
$<第一个依赖文件名编译 add.o 时,$<=add.c
$^所有依赖文件名链接 app.exe 时,$^=main.o add.o
简化优势
  • 新增源文件(如 uart.c)时,仅需在 OBJS 中添加 uart.o,无需新增编译规则;
  • 代码无冗余,降低手写错误概率
http://www.dtcms.com/a/585899.html

相关文章:

  • 信息系统项目管理师--论文case
  • win7 iis网站无法显示该页面网站上线准备
  • 华为防火墙基础功能详解:构建网络安全的基石
  • 北京网站定制设计开发公司宁波专业定制网站建设
  • 网站的后台怎么做调查问卷设计之家广告设计
  • WebRtc语音通话前置铃声处理
  • 使用XSHELL远程操作数据库
  • 淘宝客网站域名宜昌做网站哪家最便宜
  • 微信小程序中使用 MQTT 实现实时通信:技术难点与实践指南
  • Java computeIfAbsent() 方法详解
  • 做网站市场报价免费企业网站开源系统
  • 天元建设集团有限公司企业代码东莞做网站seo
  • Web前端摄像头调用安全性分析
  • 绵阳网站建设怎么做免费查公司
  • std之list
  • 前端:前端/浏览器 可以录屏吗 / 实践 / 录制 Microsoft Edge 标签页、应用窗口、整个屏幕
  • 做网站像美团一样多少钱中国最新军事消息
  • 软件项目管理实验报告(黑龙江大学)
  • 网络建设需求台州做网站优化
  • PostgreSQL一些概念特性
  • 宁夏建设厅网站6青岛网站建设公司好找吗
  • 社交营销可以用于网站制作行业吗怎样做建网站做淘客
  • 玩转Rust高级应用 如何让让运算符支持自定义类型,通过运算符重载的方式是针对自定义类型吗?
  • 基于Keras的MNIST手写数字识别卷积神经网络设计与实现
  • 百度资料怎么做网站型云网站建设
  • IP配置的基本要求
  • 单母线接线典型操作顺序
  • LightGBM三部曲:LightGBM原理
  • 【C++】C++中的文件IO
  • wordpress手机站如何做负面口碑营销案例