找回密码
 立即注册
首页 业界区 业界 Makefile极简指南

Makefile极简指南

都硎唷 3 天前
Makefile 是嵌入式开发中不可或缺的构建工具,它能自动化编译、链接流程,支持增量构建(仅重新编译修改的文件),避免重复输入冗长命令,大幅提升开发效率。
一、Makefile 核心逻辑

每个 Makefile 的规则都遵循「目标 - 依赖 - 命令」的核心结构,这是 Makefile 的灵魂:
  1. 目标: 依赖
  2.         命令  # 关键:命令前必须是【Tab键】,不能用空格!
复制代码

  • 目标:要生成的文件(如 app.exe、main.o、嵌入式固件 firmware.elf)或要执行的动作(如 clean);
  • 依赖:生成目标必需的文件(如 main.c、add.o)或其他目标;
  • 命令:从依赖生成目标的具体步骤(如编译器命令 gcc)。
二、入门实操:从单个文件到多文件

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

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

定义变量后,后续更换工具链(如嵌入式交叉编译器)时,仅需修改变量,无需改动命令:
  1. CC = gcc  # 编译器变量
  2. # 目标:依赖
  3. app.exe: main.c
  4.         # 变量引用语法:$(变量名)
  5.         $(CC) -o app.exe main.c
复制代码
在命令行输入make即可生成app.exe可执行文件。
2. 第二步:多文件编译

当项目拆分多个源文件(如主程序、驱动、工具函数)时,用 .o 中间文件做依赖,支持增量编译(仅重新编译修改的文件)。
项目结构
  1. project/
  2. ├── main.c    # 主程序(调用加法函数)
  3. ├── add.c     # 加法函数实现
  4. ├── add.h     # 加法函数声明(头文件)
  5. └── Makefile
复制代码
基础版本
  1. CC = gcc
  2. # 最终目标:链接所有 .o 文件生成可执行程序
  3. app.exe: main.o add.o
  4.         $(CC) -o app.exe main.o add.o  # 链接命令
  5. # 中间目标:.c 文件编译为 .o 文件(-c:只编译不链接)
  6. main.o: main.c add.h  # main.c 依赖 add.h(需包含函数声明)
  7.         $(CC) -c main.c
  8. add.o: add.c add.h
  9.         $(CC) -c add.c
  10. # 清理目标:删除编译产物
  11. .PHONY: clean  # 声明为伪目标,避免目录有clean文件时命令失效
  12. clean:
  13.         rm -f main.o add.o app.exe  # Linux/macOS
  14.         # 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),可用「模式规则」和「自动变量」简化,新增文件时无需修改规则。
优化版本(嵌入式推荐)

[code]CC = gcc                  # 编译器OBJS = main.o add.o       # 所有中间 .o 文件(新增文件仅需添加此处)TARGET = app.exe          # 最终目标文件名(统一管理,便于修改)# 最终目标:链接所有依赖的 .o 文件$(TARGET): $(OBJS)        $(CC) -o $@ $^  # 自动变量:$@=目标名,$^=所有依赖# 模式规则:所有 .c 文件自动生成对应的 .o 文件(替代重复规则)%.o: %.c        $(CC) -c $< -o $@  # 自动变量:$

相关推荐

昨天 00:19

举报

这个好,看起来很实用
您需要登录后才可以回帖 登录 | 立即注册