make工具与Makefile 更新ing
make工具
make是一个构建自动化工具,主要用于管理和自动化编译过程。
make工具通过读取一个名为 Makefile 的文件,执行其中定义的规则和命令,以生成目标文件(如可执行文件、库文件等)。
一、作用
- 自动化构建:通过定义规则和依赖关系,自动化编译、链接和生成可执行文件的过程。
- 增量构建:只重新编译和链接发生变化的文件,提高构建效率。
- 可维护性:通过使用变量和规则,简化构建过程的管理和维护。
- 跨平台构建:通过定义不同平台的编译选项和命令,实现跨平台构建。
二、使用
- 在包含 Makefile 的目录中运行 make 命令:bash
make
- 清理 make 生成的文件:bash
make clean
三、基本原理
通过读取 Makefile 文件,解析其中的规则和依赖关系,决定哪些文件需要重新生成。它基于文件的时间戳来判断文件是否需要更新。如果依赖文件比目标文件新,则重新生成目标文件。
通过执行make
命令,会选择Makefile文件中第一个出现的目标作为默认目标。如果你没有在命令行中指定目标,会构建这个默认目标。
Makefile文件
一、Makefile规则基本结构
makefile
target: dependencies
command # 先输出命令command,再执行command命令
@command # 不输出命令command,直接执行command命令
- target: 要生成的目标文件
- dependencies: 生成目标文件所依赖的文件
- command: 生成目标文件的命令
二、变量与伪目标
1.定义
- 变量:用于简化和复用代码。例如,CC 变量指定编译器,CFLAGS 变量指定编译选项。
- 伪目标:用于定义不生成实际文件的目标,如 clean。伪目标通常使用 .PHONY 声明。
makefile
PARAM = param
TARGET = myprogram
makefile
.PHONY: all
all: proto build
makefile
# 变量定义
CC = gcc
CFLAGS = -Wall -g
SRCS = main.c utils.c
OBJS = main.o utils.o
TARGET = myprogram
# 规则
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
main.o: main.c
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c
$(CC) $(CFLAGS) -c utils.c
# 伪目标
.PHONY: clean
clean:
rm -f $(OBJS) $(TARGET)
2.使用变量值
$(...)
代表取变量的值,$
还有一些特殊用法
$^
: 表示所有的依赖文件$@
: 表示生成的目标文件$<
: 表示第一个依赖文件
3.变量赋值
makefile
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A = AA # VIR_A的值:AA, VIR_B的值:AA B
makefile
VIR_A := A
VIR_B := $(VIR_A) B
VIR_A := AA # VIR_A的值:AA, BIR_B的值:A B
makefile
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A ?= AA # VIR_A的值:A, BIR_B的值:A B
三、其他指令
$(MAKE)
:MAKE
为特殊变量,为当前的 make 命令.SUFFIXES
: 特殊目标,用于定义文件后缀的规则,将其设置为空,可以避免默认的后缀规则干扰自定义规则。