1.Makefile
1.1 什么是 Makefile
一个工程中有很多文件,文件之间都是相辅相成有着编译的先后顺序,但是如果自己手动根据编译顺序编译文件造成速度非常慢。Makefile 是”自动化编译“,只需一个 make 指令系统就会根据编译顺序帮自己编译文件
1.2 Makefile 文件命名规则
![image-20211101115607605](https://i-blog.csdnimg.cn/blog_migrate/cfd61c825bffcd8e8765c36e0e7e35f5.png)
1.3 代码演示
1.生成一个 Makefile 文件
vim Makefile
2.将执行规则书写入 Makefile
3.使用 make 编译 Makefile 文件
sudo apt install make // 安装 make
make // 在 Makefile 所在文件夹执行指令
可以看到下图中输出了 Makefile 中的相关指令,与此同时在对应的文件下生成的 app 可执行文件
4.执行 app 可执行文件
./app
这个 Makefile 是 make 默认执行的文件,如果不想叫 Makefile 也可以自定义名称,那么在 make 时后面就要拼接相应的文件名称。比如新建的 Makefile 替代文件是 abc
make abc
1.4 Makefile 的工作原理
![image-20211101144442018](https://i-blog.csdnimg.cn/blog_migrate/0fdac5ea20d07d48466f7d0b6394dca1.png)
1.命令执行之前,检查规则中的依赖是否存在
当发现前面的命令找不到时 Makefile 文件会顺着继续向下查找后面的目标有没有有关生成前面相关文件的,如下图,一开始是没有 add.o 文件的,但是 makefile 文件会继续向下查找有没有生成 .o 的文件指令
Makefile 的指令都是为第一条指令服务的
![image-20211101143607539](https://i-blog.csdnimg.cn/blog_migrate/1e8ae9b7cad5e8e611293a7a229debc0.png)
2.检测更新
Makefile 会对文件进行检测,比如使用 make 编译过 Makefile 文件的情况下,再使用 make 编译 Makefile 文件,就发现提示
这是因为 make 是检查更新的,如果其中的文件没有更改,则就不会执行 Makefile 中的指令
1.5 Makefile 的优化
下面就要对下图的这些定义进行优化。优化一共分为三个步骤:使用变量将长字符串代替;使用通配符将重复的后缀代替;使用查找替换将长字符串中的后缀名进行查找替换
![image-20211101143607539](https://i-blog.csdnimg.cn/blog_migrate/b9517874b257b6eb32c5e3585d26b56a.png)
1.使用变量进行优化
如上图所示可以使用变量代替一个长的字符串
![image-20211101150106817](https://i-blog.csdnimg.cn/blog_migrate/b6ede89511fb48564bf1851c165d1184.png)
重新定义 Makefile 文件使用变量形式将长字符串进行取代
在最开头定义了两个变量 : src 和 target 并为其赋值。在后面使用 $(变量名) 的方法得到该变量的值。这样长字符串就在前面被定义了
2.使用通配符简化命令代码
在文件中有很多 .c ;.o 的文件,% 可以理解为是 * 的操作;%.o 类似于 *.o这样的话会将所有的 .o 文件生成 .c 文件
![image-20211101151440792](https://i-blog.csdnimg.cn/blog_migrate/defd4bbe8dfb529de2d72ab360dd4e4e.png)
![image-20211101152933807](https://i-blog.csdnimg.cn/blog_migrate/a94659c078960aee975baa8bbb53de2d.png)
3.使用“查找替换”将所有文件名替换
查找:
在自定义变量中定义了可以进行通配的文件名,下面对这些文件名进行替换
示例的意思是将本路径所有 *.c 和 sub 文件下的 *.c 文件名查找出来
![image-20211101153710078](https://i-blog.csdnimg.cn/blog_migrate/694b68d762ea01f91b740bff327ed84f.png)
替换:
![image-20211101154009105](https://i-blog.csdnimg.cn/blog_migrate/37f292636c21d7bf891c35d7d8f95736.png)
查找到 text 中的单词 patten 并用 replacement 进行替换
最后 make 执行的结果
![image-20211101154752330](https://i-blog.csdnimg.cn/blog_migrate/bde4ec0b16641ba8f4455deefaf084a5.png)
1.6 中间文件的清除
从 .c 文件到 app 可执行文件生成过程中产生大量 .o 的中间文件,下面使用 clean 的方法将中间过程的 .o 文件进行删除。同样是在 Makefile 中进行定义
![image-20211101160933915](https://i-blog.csdnimg.cn/blog_migrate/3a6e350db31ec1a599f0362f39a19eb0.png)
执行下面的指令就可以进行 clean 操作
![image-20211101161118123](https://i-blog.csdnimg.cn/blog_migrate/445c811853489b9af8980d33e77fc105.png)
对 clean 操作生成伪目标
指示 clean 是一个假的定义操作。真的定义操作利用了自定义 Makefile 的方法定义的
.PHONY:clean
![image-20211101161435904](https://i-blog.csdnimg.cn/blog_migrate/c49f0d6398e78a0735e534b8b0f2fa1b.png)