一、引入
编写一个Makfile,规则名称为clean,其命令rm不产生clean文件:
clean:
rm -f *.o
如果该Makfile文件所在目录不存在名为clean的文件,使用make clean命令运行该Makfile时,正常清除所有的.o后缀文件。
如果该Makfile文件所在目录存在名为clean的文件,再次使用make clean命令运行该Makfile,命令会失效!
二、原因分析
我们来分析一下原因:
对于具有依赖项的目标来说,如果目标不存在,或是目标所依赖的文件比目标新,就会执行后面的命令去产生或更新目标文件。
因为clean没有依赖,按说每次都会执行,但是由于当前文件夹存在clean文件,要拿clean文件和目标相比哪个更新,但是由于没有目标,make始终认为clean文件是最新的,因而不会执行相应的rm命令。
三、.PHONY
.PHONY是一个伪目标,Makefile中将.PHONY放在一个目标前就是指明这个目标是伪文件目标。其作用就是防止在Makefile中定义的执行命令的目标和工作目录下的实际文件出现名字冲突。
.PHONY clean
clean:
rm -f *.o
.PHONY
配置项的目标clean并不是其他文件生成的实际文件,使make命令会自动绕过隐含规则搜索过程,也就是说执行命令make clean会自动忽略名为"clean"文件的存在,因此声明.PHONY配置项会改善性能,并且不需要担心实际同名文件存在与否。
通俗一点讲,就是.PHONY修饰的目标clean并不是某个依赖项生成的实际文件,因此make命令不再去搜寻当前文件夹下是否有clean文件,这样少去做一些事,自然会改善性能,并且不用担心当前文件夹下是否有同名的文件。
欢迎大家进入【正规】嵌入式技术交流QQ群 100479172 ,讨论技术、工作、学业都可以,也可以一起跑路,锻炼身体:
2022/04/05于武汉