make是一个命令
makefile是一个文件
1. 使用make自动生成gcc命令
使用 touch makefile
创建一个makefile文件
使用 vim makefile
进入 vim编辑器
⮂⮂ buffers 1 mytest:test.c 2 gcc -o mytest test.c
- 在使用gcc指令之前必须加上tab键
[yzq@VM-8-8-centos my]$ make gcc -o mytest test.c
- 退出vim,使用
make
后,会自动在当前目录下查找对应的makefile文件,再去执行内置好的gcc命令
2.依赖关系和依赖方法
mytest:test.c
mytest作为目标文件,test.c作为依赖文件列表
使用test.c形成mytest,两者称之为依赖关系
gcc -o mytest test.c
称之为依赖方法
说明makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译工具
关系和方法的解读
- 比如说到月底你没钱了,你给你爸打电话要钱,过去后,你说 爸我是你儿子,这句话表明了你和你爸的关系即依赖关系,但若你只说了这一句话,你爸怎么知道你要干什么, 说明只有依赖关系是不可以的。
- 若又加了句到月底了你得给我打钱,这就表明了依赖方法,这样你爸才能把钱转给你 说明同时存在正确的依赖关系和正确的依赖方法才可以实现
3. 使用make clean 删除操作
再次输入以下内容,完成删除操作
mytest:test.c 2 gcc -o mytest test.c 3 .PHONY:clean 4 clean: 5 rm -f mytest
- 同样在
rm -f
之前也需要加上 tab
[yzq@VM-8-8-centos my]$ make clean rm -f mytest
- 输入
make clean
会自动生成 删除命令
clean : 解读
clean:
目标文件对应的依赖文件可以是空属于是特殊情况
冒号左边为 目标文件,冒号右边为 依赖文件列表
clean:
clean作为目标文件,依赖文件列表为空
4 .make 和make clean 解读
mytest是从上到下扫描遇到的第一个真正的目标文件
makefile从上到下扫描时,会默认执行第一组依赖关系和依赖方法
[yzq@VM-8-8-centos my]$ make gcc -o mytest test.c [yzq@VM-8-8-centos my]$ make clean rm -f mytest [yzq@VM-8-8-centos my]$ make mytest gcc -o mytest test.c
- 发现使用
make
和make mytest
执行的方法是相同的 - 若将
clean目标文件改变第一个目标文件
即把clean放在最前面 则使用make
时,从原来的gcc命令改为 rm删除命令
5. 连续使用 make clean解读
连续使用make 会报警告,而连续使用 make clean不会
.PHONY
: 代表总是被执行的,被修饰的称之为伪目标
clean目标文件中含有.PHONY
,clean即可称为伪目标 而mytest目标文件中不含有若将mytest目标文件加上.PHONY
- 则可以连续输入
make
,同时不会有警告存在
6. 如何直到程序是最新的呢?
正常情况下,在连续输入 make
,会显示如上警告
分析
正常情况下,先有源代码,才编译的可执行程序
- 如果可执行程序最近修改时间比源代码更晚一些,说明可执行程序是最新的
若要修改源代码,此时可执行程序一定存在了,所以源代码的最近修改时间要比可执行程序要晚
stat 指令查询
stat + 源代码/可执行程序
modify代表对内容的修改时间
使用stat命令 ,发现可执行程序最近修改时间比源代码要晚
解决方法
touch 源文件
,若源文件存在,则将时间更到最新
此时再次可以使用 make,运行gcc命令