山高疑日近,海阔觉天低

Makefile

object=input.o calcu.o main.o
#clean 声明为伪目标
.PHONY : clean
main: $(object) 
#也可以写成:gcc $(object) -o main
	gcc $^ -o main
#$@ 目标集合:也就是%.o;$<依赖文件集合中的第一个文件;$^所有依赖文件的集合
%.o: %.c
	gcc -c $<
clean: 
	rm main
	rm *.o

变量赋值:”=”相当于取地址,”:=”当前值,”?=”如果变量没有值测赋值

行业默许规则:果变量没clean:清除  distclean:比clean更加彻底,会删除makefile

自动化变量: 
$@ 规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义的目标集合。
$% 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。
$< 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么“$<”就是符合模式的一系列的文件集合。
$? 所有比目标新的依赖目标集合,以空格分开。
$^ 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。
$+ 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
$* 这个变量表示目标模式中”%”及其之前的部分

MAKECMDGOALS make的最终目标,如make -s B=1 usart  那么MAKECMDGOALS=usart
MAKEFLAGS make的参数,如make -s B=1 usart  那么MAKEFLAGS=s — B=1

Tab按键:

makefile 中Tab按键不能乱用只有shell命令之前才可以用Tab,

 

自动依赖关系:

make遇到%.o 文件回自动把%.h %.c这2个依赖加进去

而且Makefile 函数使用

1.makefile 中函数变量的使用:$(函数)  $(变量)

VALUEA=”Hello”  VALUEB=Hello; VALUEA变量包含”,因此VALUEA!=VALUEB

2.调试信息info

VGB=Hello world
$(info $(filter Hello,$(VGB)))  ==Hello
$(info $(filter-out Hello,$(VGB)))==word
$(info $(filter Hell,$(VGB)))==””

3.条件判断ifeq

ifeq (<参数 1>, <参数 2>)

ifdef <变量名>

4.字符串操作subst,patsubst

$(subst <from>,<to>,<text>)   $(subst zzk,ZZK,my name is zzk)

$(patsubst <pattern>,<replacement>,<text>) $(patsubst %.c,%.o,a.c b.c c.c)

6.字符串操作,提取第一个单词firstword

$(firstword <text>)  $(info $(firstword hello kitty)) 输出hello

7.字符提取filter

$(filter <filter_text>, <text>)   从text提取所有”filter_text”单词,$(info $(filter hello Wor,hello World)) 输出 hello

8.字符剔除filter-out

$(filter-out <filter_text>, <text>)   从text剔除所有”filter_text”单词,$(info $(filter hello Wor,hello World)) 输出 Word

9.ifeq与ifdef 

第一个是函数,第二个是宏定义,引用的时候ifeq需要 $(ifeq , ),而ifdef不需要。但是两者接同样的 else  endif

跟我一起写Makefile

赞(0) 打赏
未经允许不得转载:Mr.Zhang » Makefile

你的打赏是我的动力

登录

找回密码

注册