Makfile总结

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基本规则
编译目标:依赖文件 编译命令
  • 一个最基本的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
  • @符号
有时候在makefile当中我们不想输出某些命令(如果不进行设置makefile会输出每一条我们执行过的命令),我们就可以使用@符号进行修饰 。
main: demo.c @echo hello world
  • override覆盖命令行的赋值,让makefile文件当中的变量覆盖命令行当中的变量 。
Makefile当中进行if判断ifeq 和 ifneq主要是用于判断字符是否相等 。
cc=g++main: demo.c echo $(cc)ifeq ($(cc), gcc) echo $(cc) = 相等的语句执行了else echo $(cc) != 不相等的语句执行了endifcc=g++main: demo.c echo $(cc)ifneq ($(cc), gcc) echo $(cc) != gccelse echo $(cc) = gccendififdef 和 ifndef判断变量是否被定义或者为空
foo = 1main: demo.c echo demoifdef foo echo define fooelse echo not define fooendifmain: demo.c echo demoifdef foo echo define fooelse echo not define fooendifMakefile当中的函数在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)

推荐阅读