目录
一、什么是makefile
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中, Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编 译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就 像一个 Shell 脚本一样,也可以执行操作系统的命令。
Makefile 带来的好处就是“自动化编译” ,一旦写好,只需要一个 make 命令,整 个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个 解释 Makefile 文件中指令的命令工具,一般来说,大多数的 IDE 都有这个命令, 比如 Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的 make
二、makefile规则编写
二、编写第一个简单的makefile规则
(1)安装make
sudo apt install make
(2) 编写规则
(3)执行make命令
三、makefile工作原理并优化程序
◼ 命令在执行之前,需要先检查规则中的依赖是否存在
如果存在,执行命令
如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的, 如果找到了,则执行该规则中的命令
◼ 检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
如果依赖的时间比目标的时间晚,需要重新生成目标(就是依赖更新的时间,先有的依赖后有目标)
如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被 执行
其他规则都是为第一条规则服务,如果第一条规则中没有使用到的依赖,在后面规则目标中出现,将不会运行
四、引入makefile变量及简化程序
自定义变量 变量名=变量值 var=hello
预定义变量 AR : 归档维护程序的名称,默认值为 ar
CC : C 编译器的名称,默认值为 cc
CXX : C++ 编译器的名称,默认值为 g++
$@ : 目标的完整名称
$< : 第一个依赖文件的名称
$^ : 所有的依赖文件
◼ 获取变量的值 $(变量名)
app :main.c a.c b.c
gcc -c main.c a.c b.c
#自动变量只能在规则的命令中使用 a
pp:main.c a.c b.c
$(CC) -c $^ -o $@ $(var)
五、 引入makefile模式并简化程序
%.o:%.c
- %: 通配符,匹配一个字符串
- 两个%匹配的是同一个字符串
%.o:%.c gcc -c $< -o $
六、引入makefile函数并简化程序(最终优化以及简化的程序)
◼ $(wildcard PATTERN...)
功能:获取指定目录下指定类型的文件列表
参数:PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多 个目录,一般使用空格间隔
返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
示例: $(wildcard *.c ./sub/*.c) 返回值格式: a.c b.c c.c d.c e.c f.c
◼ $(patsubst ,,)
功能:查找中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合 模式,如果匹配的话,则以替换。
可以包括通配符`%`,表示任意长度的字串。如果 中也包含`%`,那么,中的这个`%`将是中的那个% 所代表的字串。(可以用`\`来转义,以`\%`来表示真实含义的`%`字符)
返回:函数返回被替换过后的字符串
示例: $(patsubst %.c, %.o, x.c bar.c) 返回值格式: x.o bar.o
最后加的clean是为了删除掉.o结尾的文件