makefile相关
1.makefile简介
linux下的makefile的作用就是四个字——“自动编译”。当整个项目完成之后,我们可以写一个makefile文件,输入make命令就能完成所有编译。
make其实就是linux下自带的构建器,而构建的规则就写在makefile中,makefile规定了make执行的命令,如哪些文件先编译,哪些文件后编译等。
2.makefile文件的命名
命名为:makefile 或 Makefile
3.makefile中的规则
例:gcc a.c b.c c.c -o app
makefile中分为三部分:目标、依赖、命令
目标:依赖
(tab缩进)命令
app:a.c b.c c.c
gcc a.c b.c c.c -o app
makefile中由一条或多条规则组成
4.makefile的编写
第一个版本:

缺点:效率低,修改一个文件,所有文件都会被重新编译
第二个版本:

工作原理:
检测依赖是否存在:
若依赖不存在,则向下搜索规则,查看是否有规则,用来生成缺少的依赖,并执行规则中的命令
依赖存在:
若依赖存在,则判断依赖是否需要更新。原则:目标生成时间 > 依赖生成或修改时间(即目标的生成时间要晚于依赖的生成或修改时间),反之则更新
缺点:冗余
第三个版本:
通过makefile中的变量是制定规则,去除冗余的部分
makefile中的变量:
自定义变量:
例:obj = a.o b.o c.o obj = 10
变量的取值:aa = $(obj)
makefile自带变量:大写
CPPFLAGS
CC
自动变量:只能在规则的命令中使用
$@:规则中的目标
$<:规则中第一个依赖
$^:规则中的所有依赖

模式匹配:
%是一个匹配符,第一个%和第二个%匹配的内容是相同的
流程:
开始时,搜索到main.o这个依赖文件不存在,向下搜索规则。%匹配到main,向下执行gcc -c $< -o $@命令,生成main.o依赖。
同理,搜索到后面的add.o,sub.o,mul.o依赖文件不存在,向下搜索规则并执行规则中的命令,生成依赖文件。
缺点:可移植性差
第四个版本:
通过makefile中的函数来实现(makefile中的函数都有返回值)
wildcard:查找指定目录下的指定类型的文件
例:src = $(wildcard ./*.c)
查找当前目录下所有.c文件
patsubst:匹配替换
例:obj = $(patsubst %.c,%.o,$(src))
将src中所有的.c格式的文件替换成.o格式的文件

缺点:不能清理项目
第五个版本:

编写一个清理项目的规则
例:
clean:
-rm *.o app -f
声明伪目标:防止同个目录下有与clean同名的文件或文件夹
PHONY:clean
-f:强制执行
命令前加 - :忽略执行失败的命令,继续向下执行其余的命令
执行清理命令:make clean
执行不是终极目标(makefile中第一个目标名)的目标:make 目标名

浙公网安备 33010602011771号