Makefile文件中的伪目标 .PHONY 的作用

这篇具有很好参考价值的文章主要介绍了Makefile文件中的伪目标 .PHONY 的作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、.PHONY 的作用

单词phony (即phoney)的意思是:伪造的,假的。来自collins的解释是:

If you describe something as phoney, you disapprove of it because it is false 
rather than genuine. 

那么,在Makefile中,.PHONY后面的target表示的也是一个伪造的target, 而不是真实存在的文件target,注意Makefile的target默认是文件。

举个例子:

$ cat -n Makefile1
     1    clean:
     2        rm -f foo
$ cat -n Makefile2
     1    .PHONY: clean
     2    clean:
     3        rm -f foo
  • 直接Make看看
$ ls -l
total 8
-rw-r--r-- 1 huanli huanli 18 Jul 13 17:51 Makefile1
-rw-r--r-- 1 huanli huanli 32 Jul 13 17:51 Makefile2
$ make -f Makefile1 clean
rm -f foo
$ make -f Makefile2 clean
rm -f foo

Makefile1和Makefile2的行为没有啥子区别嘛,呵呵

  • 创建一个文件clean, 再make看看
$ touch clean
$ ls -l
total 8
-rw-r--r-- 1 huanli huanli  0 Jul 13 18:06 clean
-rw-r--r-- 1 huanli huanli 18 Jul 13 17:51 Makefile1
-rw-r--r-- 1 huanli huanli 32 Jul 13 17:51 Makefile2
$ make -f Makefile1 clean
make: 'clean' is up to date.
$ make -f Makefile2 clean
rm -f foo

区别来了,Makefile1拒绝了执行clean, 因为文件clean存在。而Makefile2却不理会文件clean的存在,总是执行clean后面的规则。由此可见,.PHONY clean发挥了作用。

小结:

.PHONY: clean
    o means the word "clean" doesn't represent a file name in this Makefile;
    o means the Makefile has nothing to do with a file called "clean" 
      in the same directory.

二、伪目标的定义

目标并没有依赖文件,只有目标命令

这一类目标在makefile中叫做伪目标,普通目标对应着一个需要被生成的文件,而伪目标不对应具体的文件,它仅仅充当一个目标的标识,用作执行特定的功能,而不是执行编译过程。

例如Makefile1,它既没有依赖文件,同时也不会生成目标文件clean。所以clean是一个伪目标。

这种说法算是一个可以接受的答案,但却不是标准答案。

从应用的角度上来说,没有依赖文件且不生成对应的目标文件,这个目标就可以看成是个伪目标,依据这条规则去编写Makefile是没有问题的,但是,Makefile是由make来解析的,是不是伪目标还是得make说了算。

事实上,make遇到这种“我们所认为的伪目标”,它依旧会将其当成一个普通目标去解析。这个目标总是不生成对应目标文件,在检查依赖更新时make将其当成一个没有生成目标文件的普通目标,需要重新编译,在运行命令时会调用隐式规则试图去解析它,尽管最后执行的结果是一样的,但是这样会影响makefile的执行效率,在大型工程的编译时需要注意。

如果需要定义一个伪目标,我们可以直接使用Makefile语法支持的关键字:.PHONY,这个关键词显式地指定一个伪目标。

参考资料:

  • Phony Targets of GNU Make

ref:

Makefile文件中的 .PHONY 的作用 - 知乎

https://www.cnblogs.com/idorax/p/9306528.html

深入解析Makefile系列(0) -- 初识Makefile - 知乎

makefile--隐式规则 - 简书文章来源地址https://www.toymoban.com/news/detail-595468.html

到了这里,关于Makefile文件中的伪目标 .PHONY 的作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【InsCode】InsCode打造的JavaSE与Linux命令互融的伪Linux文件系统小项目

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:JavaSE项目 体验地址 :JavaSE基础夯实之伪Linux文件系统 实现功能 : 创建目录 删除目录 切换目录 获取路径下目录及文

    2024年02月11日
    浏览(44)
  • 无迹卡尔曼滤波在目标跟踪中的作用(二)

    在上一节的内容中,我们介绍了 UKF 中最重要的内容— 无迹变换UT ,今天我们将具体介绍 UKF 是如何实现的。 好了,话不多说,开整!!! 我们知道,我们可以使用 状态方程 和 观测方 程来 对系统进行描述 ,那么一个 非线性系统 可以用以下的方程进行描述: { X ( k + 1 )

    2024年02月12日
    浏览(50)
  • 无迹卡尔曼滤波在目标跟踪中的作用(一)

    在前一节中,我们介绍了 扩展卡尔曼滤波算法EKF 在目标跟踪中的应用,其 原理是 将非线性函数局部线性化,舍弃高阶泰勒项,只保留一次项 ,这就不可避免地会影响结果的准确性,除此以外,实际中 要计算雅各比矩阵 也 不是特别的容易 ,因此有必要研究其他的滤波算法

    2024年02月11日
    浏览(40)
  • Linux:编写编译脚本Makefile文件

    一、生成可执行文件 1、一个源文件编译 本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。 1).c文件 2) .cpp文件 经过以上测试,总结如下: 以.cpp为后缀的文件,为c++代码。代码最好使用C++语言。也可以使用c语言。 a 代码使用c++语言,编译时必须要用g++,不能使用

    2024年02月11日
    浏览(36)
  • Linux(基础IO、文件权限、Makefile)

    目录 1、man 手册 1.1 汉化 1.2 具体使用 2、文件权限 2.1 权限理解 2.2 文件详细信息查询 2.3 权限更改 3、常用函数接口 3.1 open 3.2 read 3.3 write 3.4 close 3.5 函数使用示例 4、make与Makefile 4.1 make 与 Makefile区别 4.2 Makefile的编写 5、vim简单操作 安装中文包 使用三种方式查询open接口的详

    2024年02月11日
    浏览(49)
  • 【linux基础(七)】Linux中的开发工具(下)--make/makefile和git

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到开通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 如果你不知道什么是vim和gcc 请先阅读这两篇文章后再学习本节: 文章一: vim和yum 文章二: gcc/g++ 本章重点: 本篇文章会着重讲

    2024年02月08日
    浏览(36)
  • Linux驱动1:入口与出口、头文件路径、makefile编译

    目录 Linux 驱动两种运行方式 字符设备驱动框架 1、创建目录和编写文件 2、添加头文件路径 3、Makefile编写和解释 4、编译测试 第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序; 第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),

    2024年02月10日
    浏览(44)
  • Linux中的工具:yum,vim,gcc/g++,make/makefile,gdb

    目录 1、yum 1.1 查看软件包:  1.2 安装软件包 1.3 卸载软件 2、vim 2.1 vim的三种模式 2.2 vim的基本操作 2.3. vim正常模式命令集 2.3.1 插入模式 2.3.2 移动光标 2.3.3 删除文字 2.3.4 复制 2.3.5 替换 2.3.6撤销上一次操作 2.3.7 更改 2.3.8 跳至指定的行 2.4. vim末行模式命令集 3、gcc/g++ 3.1 预处理

    2024年02月10日
    浏览(46)
  • Linux中的开发工具(yum,vim,gcc/g++,gdb,Makefile,git)

    yum(Yellow dog Updater,Modified)是Linux下非常常用的一种 包管理器 。主要应用在Fedora,RedHat,Centos等发行版上。 和手机上的软件商店类似,我们可以使用 yum 来下载各种我们想要的软件包。使用 yum 时必须联网。 yum 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装

    2024年02月08日
    浏览(45)
  • JAVA中的伪共享与缓存行

    1.CPU缓存架构 CPU 是计算机的心脏,所有运算和程序最终都要由它来执行。 主内存(RAM)是数据存放的地方,CPU 和主内存之间有好几级缓存,因为即使直接访问主内存也是非常慢的。 CPU的速度要远远大于内存的速度,为了解决这个问题,CPU引入了三级缓存:L1,L2和L3三个级别

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包