拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令。

为了避免出现这个问题,需要.PHONY: clean

=======================================================================================

所谓伪目标就是这样一个目标,它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们将一个伪目标成为标签。

那么到底什么是伪目标呢?可能作为初学者还不会在乎这个问题,下面我们来看下我们将在什么时候需要它。

首先来看下面一个例子:

当前目录下只有一个myls1.c,于是为了让程序让makefile来管理,写了一个如下的简单的makefile。

执行:

大家会发现,真的可以利用这个makefile管理当前的工程,也能如期按照我们的要求生成执行文件myls。

执行make clean,这样就可以删除可执行程序。

接着我做了个手脚,在当前目录下建立一个叫clean的文件,那么这样执行的效果是如何?

那么这个时候为什么又不能执行了?在我的makefile中其实并没有修改任何东西,为什么这个时候已经能管理工程的makefile又不能来管理文件了。

那要解决这个问题就是添加两行,修改后的makefile如下:

再次返回执行:

这样就解决了问题,那具体的原因是什么?

在makefile中我们使用伪目标就可以解决上述的问题,那为什么要使用伪目标,一种就是如例题,为了避免在makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突,另一种是提交执行makefile时的效率。

第一种情况:

如果我们需要书写这样的一个规则:规则所定义的命令不是去创建目标文件,而是通过make命令行明确指定它来执行一些特点的命令,就像例题中的clean。当文件夹中没有clean这个文件的时候,我们输入“make clean”能按照初衷执行,但是一旦文件夹中出现clean文件,我们再次输入“make clean”,由于这个规则没有任何依赖文件,所以目标被认为是最新的而不去执行规则所定义的命令。所以rm命令不会被执行。为了解决问题,我们将目标clean定义成伪目标。

也就是添加:

.PHONY:clean

那么目录中不论是否有clean文件,只要输入“make clean”就能执行rm命令了。

当一个目标被声明为伪目标后,make在执行规则时不会去试图去查找隐含规则来创建它。这样就提高了make的执行效率,也不用担心由于目标和文件名重名了。

第二种情况:

伪目标的另一种使用场合时在make的并行和递归执行过程中。

给了例子:

SUBDIRS=foo bar baz
        Subdirs:
                for dir in $(SUBDIRS)
                do
                $(MAKE) –C $$dir
                done

如果这样写,会出现几个问题:

1、 当子目录执行make出现错误,make不会退出;

2、 使用这种shell的循环方式时,没有用到make对目录的并行处理功能。

有了伪目标就可以解决上面的两个问题。

SUBDIRS=foo bar baz
        .PHONY:subdirs $(SUBDIRS)
        subdirs: $(SUBDIRS)
        $(SUBDIRS):
                $(MAKE) –C $@

一般情况下,一个伪目标不作为另一个目标的依赖。当一个伪目标没有作为任何目标的依赖时,我们只能通过make命令来明确指定它为make的终极目标,来执行它所在规则所定义的命令。

还有一个特别的伪目标——all,如果我们在一个目录下创建多个可执行程序,我们可以将所有程序的重建规则在一个makefile中描述。

all: p1 p2 p3
        p1:p1.c
        p2:p2.c

p3:p3.c

来源:http://www.cnblogs.com/chenyadong/archive/2011/11/19/2255279.html

转载于:https://www.cnblogs.com/tibetanmastiff/archive/2012/01/12/2320772.html

.PHONY makefile中的伪目标相关推荐

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

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

  2. make: *** 没有规则可制作目标“distclean”。 停止。_Makefile伪目标

    这一个章节我们主要讲的是 Makefile 中的伪目标.所谓的伪目标可以这样来理解,它并不会创建目标文件,只是想去执行这个目标下面的命令.伪目标的存在可以帮助我们找到命令并执行.使用伪目标有两点原因: ...

  3. 【Makefile由浅入深完全学习记录3】伪目标的引入

    只有不停的努力,才能看起来很轻松!!!加qq1126137994共同学习探讨更多技术!!! 1.思考: makefile中的目标究竟是什么? 在默认的情况下: make认为目标对应一个文件 make比 ...

  4. .PHONY与伪目标

    文章目录 1. .PHONY作用 2.实例 3.makefile的好处 1. .PHONY作用 有时生成的文件与伪目标重名,为了防止这种情况,使用特殊标记".PHONY"来显示的指 ...

  5. makefile中一些符号的含义

    先标注一个很好的makefile教程 这里归纳了如下符号的含义,请对号入座如下 $@, $^, $<, $?和=, +=, :=, ?=和:\ 和 $, $$和% section1:(自动化变量 ...

  6. Makefile中的双冒号规则

    双冒号规则就是使用"::"代替普通规则的":"得到的规则.当同一个文件作为多个规则的目标时,双冒号规则的处理和普通规则的处理过程完全不同(双冒号规则允许在多个规 ...

  7. makefile中.PHONY目标的意义

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

  8. makefile常见伪目标(.PHONY 不会去检查目标文件)

    .PHONY 不会去检查目标文件

  9. Makefile的伪目标

    1.Makefile伪目标的格式: .PHONY : cleanclean:rm xxxx 2.Makefile伪目标的作用: 第一种情况: 如果我们需要书写这样的一个规则:规则所定义的命令不是去创建 ...

最新文章

  1. 逃离伪PHP程序员应该做的事
  2. [iOS Animation]-CALayer 图层几何学
  3. python多线程实现
  4. Directx11教程(18) D3D11管线(7)
  5. CreateProcess error = 2,系统找不到指定的文件
  6. Java——操作集合的工具类:Collections
  7. ubuntu nginx配置负载均衡篇(一)
  8. java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园
  9. 用python祝福父亲节_父亲节给爸爸的祝福语微信48条
  10. inner join on 加条件和where加条件_图解 SQL 中各种连接 JOIN
  11. mysql 时间 sql_MySQL sql语句获取当前日期|时间|时间戳
  12. dimension and x,y,z components
  13. 关于逻辑或的一个小小应用注意点
  14. 【高等数学笔记】格林公式、高斯公式、斯托克斯公式、场论
  15. upnp+摄相头捕捉服务器端程序
  16. 深度学习之图像分类(二十五)-- S2MLPv2 网络详解
  17. 计算机专业顶级期刊,计算机领域的所有SCI一区期刊-这是最顶级期刊了.doc
  18. 如何精进Excel水平?从邮件小工具讲起
  19. [AHK]在当前目录中运行DOS命令行--DosHere
  20. 云宏大讲坛 | 饭局排桌子,排出了分布式资源调度高级规则

热门文章

  1. Spark集群启动时worker节点启不起来
  2. php文件夹列表,php获取文件夹下面的文件列表和文件夹列表
  3. (C++)1046 划拳
  4. IDEA IntelliJ 如何设置web项目的热部署
  5. 为什么学习Python数据分析
  6. servlet必知细节(三)-- DefaultServlet
  7. 7 种 Javascript 常用设计模式学习笔记
  8. kaggle之数据分析从业者用户画像分析
  9. Num55 boss09(activiti安装以及API)
  10. NLP(Natural Language Processing)