目录
3-1.Makefile要达到的效果_哔哩哔哩_bilibili 3-2.Makefile的引入及规则_哔哩哔哩_bilibili
前言:
学习的过程中,认知Makefile的作用,了解其基本的语法和规则,看得懂和能够使用通用Makefile来减轻实际项目中的工作量即可。
(1)采用gcc命令对多个.c文件编译时,以下面的为例,它需要依次编译a.c和b.c,如果对其中的文件进行修改,它又得把所有的文件重新编译一遍,这个是没有必要的。
(2)上面的方式,应对大程序的时候,就非常的不方便。我们修改源文件或头文件时,重新编译牵涉到的文件,就重新生成应用程序---这个是比较高效的编译方式。
(3)应用上面的方式,在Linux中经常使用make命令来编译程序,make命令所执行的动作依赖于MakeFile文件。
(4)Makefile的基本原理:通过比对目标文件和依赖文件的修改时间,判断是否已修改,依赖文件较新时执行相应的动作。
(5)现有通用Makefile的作用:
- ①支持多个目录、多层目录、多个文件
- ②支持给所有文件设置编译选项
- ③支持给某个目录设置编译选项
- ④支持给某个文件单独设置编译选项
一、Makefile的规则
当我们执行make命令时,会去寻找当前目录下的Makefile文件,并根据它的指示去执行操作,生成第一个目标。
一个简单的Makefile规则样式如下:
目标 (target) … : 依赖 (prerequiries) …<tab> 命令 (command)
二、Makefile的函数语法
(1)通配符pattern
通配符(pattern):精简相似规则
$@ :表示目标 $<:表示第一个依赖文件 $^:表示所有的依赖文件
test: a.o b.o c.o
gcc -o test $^%.o : %.c
gcc -c -o $@ $<
(2) 删除clean
用于删除目标文件。
clean:
rm *.o test.PHONY: clean
(3) 立即变量、延时变量
A = xxx // 延时变量,使用到时才确定
B ?= xxx // 延时变量,只有第一次定义时赋值才成功;如果曾定义过,此赋值无效C := xxx // 立即变量,在定义时即确定D += yyy // 如果 D 在前面是延时变量,那么现在它还是延时变量;
上面的变量,做个小的测试。
根据上面的阐述,相应的A、B以及C的输出结果如下:
(4) Makefile常用函数
//对于list中每一个元素赋给var,然后把var改为text描述的形式$( foreach var,list,text)//pattern所列出的文件是否存在,把存在的文件都列出来$( wildcard pattern)//在text中取出符合(不符合)pattern格式的值$( filter pattern...,text)$( filter-out pattern...,text)//寻找text中符合pattern格式的字,用replacement替换它们$( patsubst pattern,replacement,text)
上面的函数做个小的测试应用。
相应的结果: