Makefile

参考:韦东山哔哩哔哩嵌入式视频

规则

目标:依赖
语法

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	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值