目录
一,背景知识
首先我们要分清楚的便是这两个东西的本质区别。我们要明确的便是:
1.make是一个命令
2.makefile/Makefile是一个具有特定格式的文本文件。
在Linux下一个程序员是否会使用Makefile/makefile决定了这个程序员是否具备构建大项目的能力。
二,makefile/Makefile的编写
1.创建makefile/Makefile文件
在想要使用这个工具来达到我们的目的时首先便要创建一个文本文件。这个文本文件只能叫做makefile/Makefile。若是文件名字错了这个工具便是不能被使用的。创建文件:
一般在使用这个工具时创建的是Makefile。
2.在Makefile文件里写编译代码
1.准备工作:在往Makefile文件里写指令时首先便要写的便是依赖关系。这个依赖关系指的便是源文件与目标文件的关系。目标文件的生成靠的就是源文件。所以我们要先写一个源文件。
所以我们首先写一个源文件并在里面写上一些代码:
接下来便是写Makefile文件的内容了,代码如下:
在这个代码里面这几条代码的对应关系如下:
当我们运行时使用一个make便可以编译文件text.c:
当要清除这个文件时便要用到指令make clean:
在这里如果你想不想要显示make与make clean下面的指令的话便可以在指令前面加上一个@:
之后使用make与make clean指令时便是这样的:
3.伪目标——.PHONY
1.伪目标的特点
1.首先我们要知道的便是伪目标是没有依赖关系的,所以前面的clean是这样子写的:
2.伪目标文件是总是被执行的。比如我的make指令在创建完了一个目标文件后若再次想重新编译便会出现这样的情况:
但是伪目标clean便可以多次执行而不会报错:
2.怎样实现总是被执行
.PHONY:实现总是被执行的的操作的方法便是不管文件是否修改都要访问磁盘。
这里的修改包括属性修改与内容修改。那我们怎么判断文件是否被修改呢?答案便是通过文件的修改时间判断文件新旧然后判断是否被修改。这里的时间便是ACM时间。可以用指令stat+文件名查看:
这ACM时间便对应的是Access ,Modify,Change时间。在这里Modify时间表示的是文内容被修改的时间,Change表示文件属性被修改的时间。在这些时间里只有Modify时间是牵一发而动全身的,Access时间有可能访问好几次都不变,Change时间就比较随意了。
4.Makefile/makefile文件的不同编写风格
1.背景知识
1.在Makefile文件下可以定义变量名。
2.在Linux下$()有解释括号呢放入的变量内容的作用。
2.改写
在知道上面的两个特性以后便可以将Makefile文件的代码改为如下代码:
解释:
在这里再补充一点,$@可以表示冒号左边的变量,$^可以表示冒号右边的变量,所以这个代码又可以改写成为如下版本:
下面的是不能改的,因为clean的冒号两边没有文件。