目录
变量(Variables)
在 Makefile 中,你可以定义变量来存储和管理常用的值和命令。变量可以用于简化规则的书写,并提高可维护性。
定义变量
变量可以通过使用等号(=
)或冒号等号(:=
)进行定义。例如:
CC = gcc
CFLAGS = -Wall -O2
在上面的示例中,CC
和 CFLAGS
是两个定义的变量,分别存储了编译器的名称和编译选项。
使用变量
你可以在规则中使用变量。例如:
hello: main.o utils.o
$(CC) $(CFLAGS) main.o utils.o -o hello
在上面的示例中,$(CC)
和 $(CFLAGS)
分别表示编译器和编译选项。
预定义变量
Makefile 还提供了一些预定义的变量,可以直接使用:
CC
:C 编译器的名称。CFLAGS
:C 编译选项。LDFLAGS
:链接选项。LDLIBS
:链接的库。
这些预定义变量可以简化 Makefile 的书写。
自动推导规则(Automatic Rule)
自动推导规则是一种便捷的方式,使 Makefile 可以根据文件后缀自动推导出生成目标文件的规则。
示例
SRCS = main.c utils.c
OBJS = $(SRCS:.c=.o)
TARGET = hello
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)
在上面的示例中,SRCS
存储了源文件列表,OBJS
是根据源文件列表生成的目标文件列表。$(SRCS:.c=.o)
表示将 SRCS
中的所有 .c
后缀替换为 .o
后缀。最后,$(TARGET)
规则依赖于 $(OBJS)
,可以自动推导出生成目标的规则。
通配符(Wildcards)
Makefile 支持通配符,用于匹配文件名。
示例
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))
TARGET = hello
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)
在上面的示例中,SRCS
使用通配符 *.c
匹配当前目录下的所有 .c
文件,OBJS
使用 patsubst
函数将 SRCS
中的 .c
后缀替换为 .o
后缀。这样可以根据当前目录下的文件自动构建目标。
条件判断(Conditionals)
你可以在 Makefile 中使用条件判断来根据不同的情况执行不同的命令。
示例
ifeq ($(DEBUG),1)
CFLAGS += -g
else
CFLAGS += -O2
endif
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)
在上面的示例中,如果在命令行中传递了 DEBUG=1
的参数,那么 CFLAGS
将添加 -g
调试选项;否则,将添加 -O2
优化选项。根据条件判断的结果,选择不同的编译选项。