Makefile简介
参考资料:
Makefile教程
Makefile作用
Makefile是一个用于自动构建过程的文件,常用于在Uinx/Linux环境下管理编译和链接源代码的步骤。它是Make工具的输入文件,定义了如何从源文件生成目标文件(例如可执行文件或库),以及清理构建目录等任务。通过Makefile,可以简化和自动化编译过程,避免手动输入繁琐的编译命令。
自动化构建过程
定义构建规则和依赖关系,自动化执行编译和链接步骤。
通过一条简单的命令(通常是 make),完成从源代码到可执行文件的构建。
依赖管理
追踪文件之间的依赖关系,只重新编译那些发生改变的文件,节省编译时间。
通过检查文件的时间戳,确保所有依赖关系都得到满足。
提高效率
减少重复工作,避免手动输入多个编译命令。
提供一种一致且可重复的构建方法,降低出错的可能性。
灵活性和可扩展性
可以通过变量和条件判断增加灵活性,适应不同的构建环境和配置。
支持自定义规则和目标,可以扩展构建过程,例如生成文档、运行测试等
Makefile 的基本结构
变量定义
- 用于简化命令和路径的管理,例如源文件列表,编译器选项等
CC = gcc
CFLAGS = -Wall -g -O2
SRCS = main.c utils.c
OBJS = $(SRCS:.c=.o)
规则定义
- 每个规则定义了如何从一组依赖文件生成目标文件。规则由目标(target)、依赖(dependencies)和命令(commands)组成。
target: dependencies
command
- 示例
all: my_program
my_program: main.o utils.o
$(CC) -o my_program main.o utils.o $(CFLAGS)
main.o: main.c
$(CC) -c main.c $(CFLAGS)
utils.o: utils.c
$(CC) -c utils.c $(CFLAGS)
自动变量
- 在规则的命令部分使用的特殊变量,例如:
$@:目标文件名。
$<:第一个依赖文件名。
$^:所有依赖文件名
main.o: main.c
$(CC) -c $< -o $@ $(CFLAGS)
伪目标
- 不生成文件的目标,用于定义一些常见任务,如清理构建目录。