Make file 函数和实例

Make file 函数和实例


本文是基于韦东山视频的学习笔记

函数

函数就多咯,只说几个常用的吧。

  • $(foreach var,list,text) //把list中的每个元素逐个循环地赋值给var
  • $(filter patten…, text) //过滤函数
  • $(filter-out patten…, text) //反过滤函数…?反正和过滤函数是反的
  • $(wildcard patten) //用来找当前目录的文件的,patten是关键字
  • $(patsubst patten, replacement, $(var)) //替代函数
A = a b c
B = $(foreach f, $(A), $(f).o)
C = a b c d/
D = $(filter %/, $(C))
E = $(filter-out $/, $(C))

# 当前目录下有a.c b.c c.c 
files = $(wildcard *.c)
files2 = a.c b.c c.c d.c e.c
files3 = $(wildcard $(files2))

dep_files = $(patsubst %.c, %.d, $(files2))

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 = a.c c.c b.c
files3 = a.c b.c c.c
dep_files = a.d b.d c.d d.d e.d 

实例

其实之前的Makefile文件是有个致命缺陷的,在Make file里面并没有包含.h文件。缺陷是,万一修改了.h文件,Make file文件是不会重新生成目标文件的,所以呀

hello: A.o B.o C.o D.o E.o
	gcc -o hello $^

# 需要把.h也加入为c.o的依赖文件,这样一来.h文件更新时Make file就会重新生成 
c.o: c.c c.h

%.o: %.c
	gcc -c -o $@ $<

clean: 
	rm *.o hello

.PHONY: clean

问题来了,难道所有头文件都要我自己手动添加吗,早就有人想到了:自动生成依赖。

  • gcc -M hello.c //打印hello.c的依赖文件
  • gcc -M -MF hello.d hello.c //把依赖写进hello.d
  • gcc -c -o hello.c -MD -MF hello.d //编译,并把依赖写进hello.d

对于选项,这里比较详细的说明:Linux Makefile 生成 *.d 依赖文件以及 gcc -M -MF -MP 等相关选项说明——Jerry.yl

同样地,每个目标文件生成依赖我都要这样写!?

函数的作用就来了。

objs = A.o B.o C.o D.o E.o

dep_file := $(patsubst %.o, .%.d, $(objs))	#所有依赖文件名字变量存储在dep_files

hello: 
	gcc -o hello $^

include $(dep_file)							#把包含所有依赖文件包含起来

%.o: %.c
	gcc -c -o $@ $< -MD -MF .$@.d 			#文件前面的点“.”是指在当前目录隐藏

clean: 
	rm *.o hello

disclean:
	rm $(dep_files)							#删除所有依赖文件

.PHONY: clean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值