1. 版本说明

首先说一下我用的make版本:

GNU Make 4.2.1

2. 无PHONY无clean的情况(无clean指当前目录下不存在clean文件)

文件名:makefile (听说M必须大写,我用小写也可以执行成功)

文件内容:

且目录下只有这一个文件

make 和 mak clean的效果一样 (这两个命令有什么区别?待查明后补充)

3. 术语补充

这里补充一个makefile的术语:规则

规则:用于说明如何生成一个或多个目标文件

规则的格式:

targets:prerequisites

command(必须是一个tab键,不能多也不能少,但是可以设置一个tab=4个空格)

对应上面的makefile

targets为clean,  前置依赖为空, command为rm -rf test

4. 无PHONY有clean的情况

提示clean是最新的,为什么会出现这条提示呢?

因为targets无前置依赖的时候,总是认为targets为最新。

5. 有PHONY,有clean的情况

当我们make生成目标文件和一堆临时文件后,想清理这些文件,这么写make,明显不会删除。所以,PHONY来了,一旦声明为PHONY的前置依赖,那么,make 或 make clean将忽略targets是否存在,直接运行commands。

1. 当前目录下存在clean,和test文件。

2. 当声明.PHONY:clean后,忽略clean文件的存在,直接执行命令

3. 所以test文件被删除了。

补充:

一、make和make clean的区别

make
根据Makefile文件编译源代码、连接、生成目标文件、可执行文件。
make clean
清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

上面举的例子不是一个正常的编译makefile,下面以一个正常的makefile举例。

test.c文件内容

#include<stdio.h>
void main()
{printf("hello world/n");
}

makefile内容:

ALL:testtest.o:test.cgcc -c test.c -o test.otest:test.ogcc test.o -o testclean:rm -rf test test.o

可以看到,执行make后,makefile的前3个规则都执行了,make clean后,最后一个规则执行了。

此时,有2个问题:

1. 为什么make的时候,clean规则没有执行

2. clean规则可以改成别的名字吗,此时,还是执行make clean 还是 make 别的名字。

先来看第二个问题:

makefile内容:

ALL:testtest.o:test.cgcc -c test.c -o test.otest:test.ogcc test.o -o testaaa:rm -rf test test.o

make还是执行前3个规则,当clean改名后,再执行make clean是没有效果的,也就是说,make clean的clean是规则名,而不是约定的名称。再执行make aaa,则完成临时文件的清理。 即,我们也可以执行make test.o 或者make test,都是可以执行的。

此时,又产生了一个问题:

ALL规则没有command, clean 规则没有前置依赖, 在执行时,会怎么样?

这里再补充一个概念,默认目标。第一行的ALL就是默认目标。在这个脚本里,ALL同样还是一个伪目标,所以不会生成ALL文件,但是ALL的依赖文件会生成。

为什么clean没有执行?

当clean非第一行时,因为其没有依赖文件,所以,默认其为最新的,不需要编译,就无需执行。只能通过手动触发来执行。

makefile之.PHONY相关推荐

  1. Makefile之 .PHONY 作用

    Makefile之 .PHONY 作用 ./PHONY 来显示的指名一个目标是伪目标,有两个作用一个是改善性能,另外一个是来避免冲突. 例如我写了这样一个Makefile [cpp] view pla ...

  2. makefile中.PHONY的作用是什么?

    makefile中.PHONY的作用是什么?   初学makefile的时候,有一个关键字".PHONY"搞不懂,在请教过同学之后豁然开朗,遂写下经验望帮助更多的同学能够理解. 在 ...

  3. makefile中.PHONY的最直接理解

    makefile中.PHONY的最直接理解 为了避免和文件重名的这种情况,可以使用一个特殊的标记".PHONY"来显示地指明一个目标是"伪目标",向make说明 ...

  4. Makefile中.PHONY的作用

    单词phony (即phoney)的意思是:伪造的,假的.来自collins的解释是: If you describe something as phoney, you disapprove of i ...

  5. 【C基础】Makefile(含.phony的作用)和CMake

    目录 1. Makfile 1.1.基础 1.2. 伪对象.PHONY 1.3. 变量 1.3.1. 普通变量 1.3.2. 自动变量 1.4.依赖第三方库 2. CMake Makefile 是编译 ...

  6. makefile中.PHONY目标的意义

    在makefile文件中,会频繁的看到许多".PHONY"目标,例如: .PHONY: build_docker_image build_docker_image:# build ...

  7. Makefile中.PHONY伪目标的作用(完整)

    第一种情况:避免命令与目录下的文件名重复 实际上这个情况很少发生,但网上大部分博客也仅介绍了这一种情况.这里以如下Makefile简单介绍一下: clean:rm -f *.o temp 如果当前目录 ...

  8. Makefile中.PHONY的含义

    目录标题 含义 作用 说明 含义 单词phony (即phoney)的意思是:伪造的,假的. 在Makefile中, .PHONY后面的target表示的也是一个伪造的target, 而不是真实存在的 ...

  9. Makefile的.PHONY

    .PHONY 存在的意义是设定假目标,避免错误 使用注意事项 .PHONY 以上至少要和别的内容空一行,不然容易报错(经验,目前还不知道原因)

最新文章

  1. C语言模块化编程的例子
  2. 内存管理代码分析 stm32
  3. react 文本框_React自动完成文本框
  4. NOI入门级:排序算法
  5. 重磅!浙大博士两破世界纪录,三年两获浙大竺可桢奖学金!
  6. UVA11192 Group Reverse【水题】
  7. 计算机存储单位以及内存原理
  8. 数学建模——层次分析法
  9. opencv cv::Mat::convertTo()函数
  10. ubuntu系统克隆实用教程
  11. 腾讯云弹性MapReduce
  12. 易语言禁止服务器,禁止指定程序联网易语言源码
  13. exchange java_java中用Exchange
  14. docker容器2:镜像制作
  15. linux rescue u盘,linux 0-rescue
  16. 高等代数 具有度量的线性空间(第10章)5 正交空间与辛空间
  17. python程序流程控制_Python流程控制语句详解
  18. 量子计算机是否存在相对论,从量子到宇宙——颠覆人类认知的科学之旅
  19. 开局觉醒天道酬勤天赋(一)
  20. python程序设计丁亚涛版_Python程序设计

热门文章

  1. Windows设置本地DNS域名解析Hosts
  2. python文档生成工具pydoc
  3. IE0新特性归纳及JavaScript 功能增强分析
  4. 小米会不会用鸿蒙,小米是否会搭载鸿蒙?
  5. Java程序员从笨鸟到菜鸟之(四)练习
  6. linux scp命令使用详解
  7. intellij代码审查space
  8. 校验银行卡是否有效, 获取所属行, 校验预留信息
  9. android前端代码编辑器,前端程序员福利,6款轻量级富文本编辑器
  10. 庞果网之杨辉三角的变形