Makfile总结在前面的三篇文章彻底掌握Makefile(一)、彻底掌握Makefile(二)和彻底掌握Makeifle(三)当中我们仔细介绍了Makefile各种使用方法,在本篇文章当中主要是对前面三篇关于makefile的文章做一个总结,方便大家快速查阅和检查 。
Makefile基础以及小技巧Make命令的工作流程当我们在命令行当中输入make
的时候他的执行流程如下:
- make命令首先会在当前目录下面寻找makefile或者Makefile文件 。
- 寻找到makefile文件之后,他会在文件当中寻找到一个编译目标 , 比如在上面的makefile文件当中他会找到
demo
这个编译目标,而不是clean
这个目标,因为clean
是第二个编译目标 。 - 然后make会解析编译目标的依赖,如果这个依赖是其他的编译目标A的话,那么make会先完成它依赖的编译目标A的命令,如果它依赖的编译目标A也存在依赖B的话,make就会去执行依赖的B的编译命令,如此的递归下去,知道有所得依赖目标都存在了 , 才会完成第一个编译目标的编译,这个也很好理解,只有依赖文件都存在了我们才能够完成正确的编译过程 。
- makefile基本规则
编译目标:依赖文件 编译命令
- 一个最基本的makefile
main: demo.o myprint.o gcc demo.o myprint.o -o out echo make 解析编译完成demo.o: demo.c gcc -c demo.c -o demo.omyprint.o: myprint.c gcc -c myprint.c -o myprint.oclean: rm myprint.o demo.o out
- 在makefile当中使用变量
cflags=-cmain: demo.o myprint.o gcc demo.o myprint.o -o outdemo.o: demo.c gcc $(cflags) demo.c -o demo.omyprint.o: myprint.c gcc $(cflags) myprint.c -o myprint.oclean: rm myprint.o demo.o out
- 在makefile当中使用include
include submakefiledemo.o: demo.c gcc $(cflags) demo.c -o demo.omyprint.o: myprint.c gcc $(cflags) myprint.c -o myprint.oclean: rm myprint.o demo.o out
- 在makefile当中使用PHONY
cflags=-cmain: demo.o myprint.o gcc demo.o myprint.o -o maindemo.o: demo.c gcc $(cflags) demo.c -o demo.omyprint.o: myprint.c gcc $(cflags) myprint.c -o myprint.oclean: rm myprint.o demo.o main.PHONY: clean # 增加这一行
- 在makefile当中使用通配符
cflags=-cmain: demo.o myprint.o gcc demo.o myprint.o -o main%.o: %.c gcc $(cflags) $<clean: rm myprint.o demo.o main.PHONY: clean
- 在makefile当中使用VPATH自动搜索
cflags=-cVPATH=./filesmain: demo.o myprint.o a.o b.o gcc demo.o myprint.o a.o b.o -o maindemo.o:demo.c gcc $(cflags) demo.c myprint.o:myprint.c gcc $(cflags) myprint.c a.o: a.c gcc $(cflags) $<b.o: b.c gcc $(cflags) $<clean: rm myprint.o demo.o main.PHONY: clean
- @符号
main: demo.c @echo hello world
- override覆盖命令行的赋值,让makefile文件当中的变量覆盖命令行当中的变量 。
cc=g++main: demo.c echo $(cc)ifeq ($(cc), gcc) echo $(cc) = 相等的语句执行了else echo $(cc) != 不相等的语句执行了endif
cc=g++main: demo.c echo $(cc)ifneq ($(cc), gcc) echo $(cc) != gccelse echo $(cc) = gccendif
ifdef 和 ifndef判断变量是否被定义或者为空foo = 1main: demo.c echo demoifdef foo echo define fooelse echo not define fooendif
main: demo.c echo demoifdef foo echo define fooelse echo not define fooendif
Makefile当中的函数在makefile当中除了能够使用条件表达式之外我们还可以使用函数 , 在makefile当中函数的使用规则如下:$(<函数名> <函数参数>)或者将()替换为{}
函数的调用规则如上图所示,函数参数用.隔开 。字符串函数subst
$(subst <from>,<to>,<text>)
- 字符串替换函数 。
- 表示文本,这个函数会将text当中是的字符串替换为 。
s = ii am learning makefiless = $(subst ii, you, $(s))main: demo.c echo demo echo $(s) echo $(ss)
patsubst$(patsubst <pattern>,<replacement>,<text>)
- pattern 表示第一个参数,用于表示如何对 text 进行匹配 。
- replacement 表示第二个参数 表示如何对匹配的字符进行重写 。
- patsubst在进行匹配替换的时候,会先将字符串text根据空格或者tab键或者回车换行符进行分割,然后一一的进行替换和匹配 。
s = a.c b.c d.c abc.c abo.css = $(patsubst %.c, %.o, $(s))main: demo.c echo demo echo $(s) echo $(ss)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- DophineSheduler上下游任务之间动态传参案例及易错点总结
- JS 模块化-05 ES Module & 4 大规范总结
- 打麻将技巧与方法总结(打麻将10句口诀)
- Optional 常用方法总结
- 月工作总结与计划怎么写 月工作总结与计划怎么写?
- 小学数学教师教育教学总结 小学数学教育教学心得反思总结
- 二年级数学模块的教学回顾总结
- 初三化学知识点总结 初三化学复习知识点
- 初三化学第一单元知识点总结 初三化学的元素知识点总结
- 河南中考数学考点总结 河南中考数学考点整理