博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第3课 - makefile伪目标的引入
阅读量:6079 次
发布时间:2019-06-20

本文共 1807 字,大约阅读时间需要 6 分钟。

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 : cleanclean :    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 allrebuild : clean allall : hello.outclean :    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.cclean : FORCE    rm *.o hello.outFORCE :             

‘’

 

转载于:https://www.cnblogs.com/hoiday/p/9250211.html

你可能感兴趣的文章
jekins 持续集成手记
查看>>
Android 为应用创建、删除桌面快捷方式
查看>>
Maven如何手动添加依赖的jar文件到本地Maven仓库
查看>>
Oracle安装部署,版本升级,应用补丁快速参考
查看>>
【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面
查看>>
CentOS6.5安装Tab增强版:bash-completion
查看>>
2015华为机试——数字基root
查看>>
Java学习笔记(四):流程控制
查看>>
ios开发--第三方整理
查看>>
【JVM】JVM系列之内存模型(六)
查看>>
MySQL排序原理与案例分析
查看>>
RegexBuddy正则表达式工具
查看>>
rabbitmq 连接測试
查看>>
WPF控件 RichTextBox查找定位匹配字符
查看>>
etcd+calico集群的部署
查看>>
【Java并发编程】并发编程大合集-值得收藏
查看>>
tomcat7禁用catalina.out输出
查看>>
Symantec Backup Exec 报"Access denied to directory xxx" Error Code E0008488
查看>>
ANativeWindow_fromSurface
查看>>
Core Java 总结(字符和字符串类问题)
查看>>