参考:韦东山哔哩哔哩嵌入式视频
规则
目标:依赖
语法
test:a.o b.o
gcc -o test a.o b.o
a.o:a.c
gcc -c -o a.o a.c
b.o:b.c
gcc -c -o b.o b.c
通配符
$@ 表示目标文件
$< 表示第一个依赖文件
$^ 表示所有的依赖文件
test: a.o b.o c.o
gcc -o test $^
%.o : %.c
gcc -c -o $@ $<
clean
clean:
rm *.o test
.PHONY: clean #加上,防止工程中已经有clean文件,对结果产生干扰,需要把目标设定为假象目标
变量
- 简单变量(即时变量)
A := XXX #A的值在定义是即刻确定
B = XXX #B的值使用时才确定
:= # 即时变量
= # 延时变量
?= # 延时变量,如果在第一次定义才起效,如果在前面该变量已定义,则忽略此句
+= # 附加变量,他是即时变量还是延时变量取决于前面的定义
A := $(C)
B = $(C)
C = abc
#D = 100ask
D ?= weidongshan
all:
@echo A = $(A)
@echo B = $(B)
@echo D = $(D)
C += 123
######################运行结果##################
A =
B = abc 123
D = weidongshan
常用的函数
A = a b c
B = $(foreach f, $(A), $(f).o)
C = a b c d/
D = $(filter %/, $(C)) #在列表C中寻找满足%/格式的字符
E = $(filter-out %/, $(C))#在列表C中寻找不满足%/格式的字符
files = $(wildcard *.c)#符合*.c格式的文件有哪些
files2 = a.c b.c c.c d.c e.c abc
files3 = $(wildcard $(files2))
dep_files = $(patsubst %.c,%.d,$(files2)) #在files2列表中将满足%.c格式的文件,替换成%.d格式
all:
@echo B = $(B)
@echo D = $(D)
@echo E = $(E)
@echo files = $(files)
@echo files3 = $(files3)
@echo dep_files = $(dep_files)
######################运行结果##################
B = a.o b.o c.o
D = d/
E = a b c
files = c.c a.c b.c
files3 = a.c b.c c.c
dep_files = a.d b.d c.d d.d e.d abc
头文件依赖和CFLAGS
objs = a.o b.o c.o
dep_files := $(patsubst %,.%.d, $(objs))
dep_files := $(wildcard $(dep_files))
CFLAGS = -Werror -Iinclude #编译参数
test: $(objs)
gcc -o test $^
ifneq ($(dep_files),)#是否存在依赖文件
include $(dep_files)#如果存在就包含依赖文件
endif
%.o : %.c
gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d
# .$@.d 打印出依赖的隐藏文件
clean:
rm *.o test
distclean:
rm $(dep_files)
.PHONY: clean