第3课 - makefile伪目标的引入

1. makefile 中的目标究竟是什么?

  (1)默认情况下,make 认为目标对应着一个文件  ==>  目标即文件名

  (2)make 首先会检测目标对应的文件是否存在,若不存在则执行依赖和命令。若存在则会比较目标文件和依赖文件的新旧关系,决定是否执行命令。

      在 make 中,通过比较目标文件和依赖文件的时间戳,来判断两者的新旧关系。make 程序使用的时间戳的类型是 mtime(modify time),即文件发生修改的时间。

      在 linux 中,有三个时间的概念,修改时间 mtime(modify time)、访问时间 atime(access time)、状态改动时间 ctime(change time)。

  (3)make 以文件处理作为第一优先级。

2. 伪目标的引入

  下面的代码有什么意义?   

  

  执行 make clean 会将第2课中编译生成的中间 .o 文件和 hello.out 目标文件删除。但如果该目录下存在名为 clean 的文件就会导致删除命令执行失败。

  有时我们并不希望目标对应的都是文件,而只是把目标当作一个标签来使用,这就引入了makefile中的伪目标。

  (1)makefile 中的伪目标

    • 通过 .PHONY 关键字声明一个伪目标
    • 伪目标不对应任何实际的文件(目录下有同名的文件也不会影响执行
    • 不管伪目标的依赖是否更新,命令总是执行

  (2)makefile 伪目标的语法:先声明,后使用

    本质:伪目标是 make 中特殊目标 .PHONY 的依赖。

    

编程实验

 # makefile伪目标的引入

 hello.out all : func.o main.o
gcc -o hello.out func.o main.o func.o : func.c
gcc -o func.o -c func.c main.o : main.c
gcc -o main.o -c main.c .PHONY : clean
clean :
rm *.o hello.out

  (3)makefile 伪目标的妙用:规则调用(函数调用)

  

 原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。当执行 make rebuild 时首先会删除之前编译生成的垃圾文件,然后重新编译整个工程。

 # makefile中利用伪目标实现规则调用

 hello.out : func.o main.o
gcc -o hello.out func.o main.o func.o : func.c
gcc -o func.o -c func.c main.o : main.c
gcc -o main.o -c main.c .PHONY : rebuild clean all rebuild : clean all all : hello.out clean :
rm *.o hello.out

  (4)技巧:绕开 .PHONY 关键字定义伪目标

    .PHONY 关键字只有标准的make(GNU make)才拥有,在使用非标准的make时可以使用如下技巧定义伪目标。   

    

  原理:如果一个规则只有一个目标,并且该目标不是一个存在的文件名,则在执行此规则时,目标总会被认为是最新的。

       当执行 make clean 时,由于 FORCE 会被认为是最新的(FORCE 比 clean 要新),clean 下的命令必然被执行。

 #非GNU make下伪目标的实现方法

 hello.out : func.o main.o
gcc -o hello.out func.o main.o func.o : func.c
gcc -o func.o -c func.c main.o : main.c
gcc -o main.o -c main.c clean : FORCE
rm *.o hello.out
FORCE :

注:本文整理于《狄泰12月提升计划》课程内容

狄泰QQ群:199546072

第3课 - makefile伪目标的引入的更多相关文章

  1. Makefile 文件格式;makefile伪目标

    Makefile包含 目标文件.依赖文件.可运行命令三部分. 每部分的基本格式例如以下: test: prog.o  code.o gcc  -o  test   prog.o   code.o 当中 ...

  2. Makefile伪目标

    https://www.zybuluo.com/lishuhuakai/note/210174 本节我们讨论一个Makefile中的一个重要的特殊目标:伪目标. 伪目标是这样一个目标:它不代表一个真正 ...

  3. Makefile的伪目标

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

  4. Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践

    Makefile的工作流程 http://c.biancheng.net/view/7091.html Makefile文件是什么? 我们教程主要是讲的是 Makefile .很多 Linux(Uni ...

  5. Makefile目标,伪目标,头文件自动依赖

    目标 即我们最终要生成的文件,make默认生成第一个目标,注意 makefile中tab和空格不是一回事,规则使用tab缩进,编辑器不要设置诸如"将tab替换为空格之类的选项",目 ...

  6. makefile中的伪目标

    伪目标就是总是被执行的目标,相对于目标来说,伪目标不会去考虑它的依赖的时间戳与自己时间戳的新旧关系,从而决定是否执行规则.伪目标格式: .PHONY:clean clean: -rm *.o 在mak ...

  7. makefile中伪目标的理解

    1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command - - 2. 假如编译两个文件可以这么写: a.o:a.c  gcc -c ...

  8. 第三篇 makefile的伪目标

    我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下:    1.make将makefile的目标认为是一个文件:    2.make解释器比较目标文件和依赖文件的新旧关系,决定是否 ...

  9. Makefile编写 三 伪目标的作用

    本节我们讨论一个Makefile中的一个重要的特殊目标:伪目标. 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们也可以将一个伪目标 ...

随机推荐

  1. 将本地项目推送到远程gitee仓库(通过git命令)

    只有经历过地狱般的磨砺,才能练就创造天堂的力量: 只有流过血的手指,才能弹出世间的绝响 将本地的项目推送到远程gitee仓库 本地新建的Java项目,想推送到远程gitee仓库或者git仓库,你需要两 ...

  2. CompletableFuture异步线程

    1.线程池七大参数介绍 (1)corePoolSize:线程池中常驻核心线程数 (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1 (3)keepAliveT ...

  3. [netty4][netty-buffer]netty之池化buffer

    PooledByteBufAllocator buffer分配 buffer分配的入口: io.netty.buffer.PooledByteBufAllocator.newDirectBuffer( ...

  4. Git操作之码云代码clone

    安装Git https://git-scm.com/book/zh/v2/起步-安装-Git Git的网站上有详细的分各种系统的安装教程. 配置Git 1. 打开你要放置项目的本地路径,右键选择$ G ...

  5. 为什么 java.util.Stack不被官方所推荐使用!

    Java 为什么不推荐使用 Stack 呢? 因为 Stack 是 JDK 1.0 的产物.它继承自 Vector,Vector 都不被推荐使用了,你说 Stack 还会被推荐吗? 当初 JDK1.0 ...

  6. js 常用业务工具方法 (es5,es6)持续更新

    数组去重 数组去重最原始的方法就是使用双层循环. es5: // 使用indexOf function unique(array) { var res = []; for (var i = 0, le ...

  7. 第一篇 Scrum冲刺博客

    一.Alpha任务认领 冯荣新 任务 预计时间 搜索框 0.5h 首页轮播图 0.5h 分类导航 2h 商品列表 2h 商品详情轮播图 0.5h 商品底部工具栏 1h 购物车列表 1.5h 购物车工具 ...

  8. 严重性代码说明项目文件行 禁止显示状态错误 C4996 fopen('fscanf'、strcmp):This function or variable may be unsafe. 最全解决办法

    解决fopen.fscanf 在VS中要求替换为fopen_s.fscanf_s的最全解决办法 方法一:在程序最前面加#define _CRT_SECURE_NO_DEPRECATE: 方法二:在程序 ...

  9. zstd和zip操作6g的文本

    ssd是在固态硬盘上的时间 1.txt   7038308223 bytes 都是默认级别 ======================================== zstd-v1.4.4-w ...

  10. Laravel chunk和chunkById的坑

    Laravel chunk和chunkById的坑 公司中的项目在逐渐的向Laravel框架进行迁移.在编写定时任务脚本的时候,用到了chunk和chunkById的API,记录一下踩到的坑. 一.前 ...