Makefile 的基本结构
一个 Makefile 通常包含变量定义、规则和命令。其基本结构如下:
# 变量定义
VARIABLE_NAME = value
# 规则定义
target: dependencies
command
变量定义
在 Makefile 中,变量定义类似于 shell 脚本中的变量。使用变量可以简化 Makefile 的维护。
CC = gcc
CFLAGS = -Wall -g
all: program
program: main.o utils.o
$(CC) $(CFLAGS) -o program main.o utils.o
在这里,CC
和 CFLAGS
是变量,可以在规则中使用。变量的值可以通过 ${VARIABLE_NAME}
或 $(VARIABLE_NAME)
进行引用。
规则定义
一个规则通常由三部分组成:目标、依赖和命令。
target: dependencies
command
- 目标(target): 这是你要生成的文件,比如可执行文件或对象文件。
- 依赖(dependencies): 生成目标所依赖的文件或其他目标。如果依赖文件发生了变化,目标将被重新生成。
- 命令(command): 用于生成目标的命令,必须以 Tab 缩进。
示例
以下是一个简单的示例,用于编译一个 C 程序:
CC = gcc
CFLAGS = -Wall -g
# 目标:最终生成的可执行文件
all: my_program
# 可执行文件依赖于对象文件
my_program: main.o utils.o
$(CC) $(CFLAGS) -o my_program main.o utils.o
# 生成对象文件
main.o: main.c
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c
$(CC) $(CFLAGS) -c utils.c
# 清理目标
clean:
rm -f my_program *.o
特殊变量和函数
- $@: 表示目标文件。
- $<: 表示第一个依赖文件。
- $^: 表示所有依赖文件。
- $?: 表示比目标文件更新的所有依赖文件。
内置规则和自动推导
Make 有一些内置规则,可以自动推导编译命令。例如,可以省略对象文件的生成规则:
CC = gcc
CFLAGS = -Wall -g
all: my_program
my_program: main.o utils.o
$(CC) $(CFLAGS) -o my_program $^
clean:
rm -f my_program *.o
使用模式匹配
可以使用模式匹配规则来简化重复的规则:
CC = gcc
CFLAGS = -Wall -g
all: my_program
my_program: main.o utils.o
$(CC) $(CFLAGS) -o my_program $^
%.o: %.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f my_program *.o
在这个示例中,%.o: %.c
是一个模式匹配规则,它适用于所有以 .c
为后缀的文件,将其编译成对应的 .o
文件。
伪目标
伪目标(Phony Targets)是指不生成实际文件的目标,通常用于定义一些任务,比如 clean
:
.PHONY: clean
clean:
rm -f my_program *.o
.PHONY
声明告诉 make clean
是一个伪目标,即使有一个名为 clean
的文件,make 也会执行其命令。