在进行大项目开发的时候,生成程序的依赖文件比较多,此时用gcc编译器一个个去编译比较繁琐,Makefile可以有效地提升编译地效率。
我把我学习Mikefile的过程分为四层,便于理解。
一、第一层(显示规则)
1、创建一个Makefile文件
以 vscode 远程链接 Linux 系统为例 ,可以在终端使用 touch Makefile 命令创建一个Makefile文件
也可以在文件里直接创建
2、Makefile的语法规则
Makefile是一门全新的脚本文件,所以在里面执行命令和在终端执行命令是没有区别的。
1、目标文件:即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。(默认情况下Makefile的第一个目标为终极目标。)
2、依赖文件:即目标文件由哪些文件生成。
3、命令:即通过执行命令由依赖文件生成目标文件。注意每条命令之前必须有一个tab保持缩进,这是语法要求
执行该Makefile脚本,效果如下
3、伪目标
伪目标只是一个标签,clean是个伪目标没有依赖文件,只有用make来调用时才会执行
当目录下有与make 命令 同名的文件时 执行make 命令就会出现错误。
解决办法就是使用伪目标
效果如下,可以看到执行 make clean 之后 hello.o 被删除了
二、第二层(变量)
1、"="是最普通的等号,在Makefile中容易搞错赋值等号,使用 “=”进行赋值,变量的值是整个Makefile中最后被指定的值。
比如,在这个目录下有多个依赖文件,我们可以用一个变量来替代这些依赖文件。同时,也可以用变量来代替命令和目标文件
注意:在用变量替换之后,只用变量的格式为 $(变量) 。
三、第三层(隐含规则)
%.c和%.o 代表任意的一个 .c 和 .o 文件,*.c 和 *.o 代表所有的 .c 和 .o 文件
可以用%.c 和 %.o 对部分目标文件或者依赖文件进行替换。
四、第四层(通配符)
$^ 表示所有的依赖文件
$@ 表示生成的目标文件
$< 代表第一个依赖文件
在写makefile的过程中 可以使用通配符替换命令中的文件,使代码更简洁,移植性和效率更高。
五、总结
此文章用于初步学习记录,用于后续的复习,欢迎大家提出建议