第3课 - makefile伪目标的引入
第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伪目标的引入的更多相关文章
- Makefile 文件格式;makefile伪目标
Makefile包含 目标文件.依赖文件.可运行命令三部分. 每部分的基本格式例如以下: test: prog.o code.o gcc -o test prog.o code.o 当中 ...
- Makefile伪目标
https://www.zybuluo.com/lishuhuakai/note/210174 本节我们讨论一个Makefile中的一个重要的特殊目标:伪目标. 伪目标是这样一个目标:它不代表一个真正 ...
- Makefile的伪目标
1.Makefile伪目标的格式: .PHONY : cleanclean: rm xxxx 2.Makefile伪目标的作用: 第一种情况: 如果我们需要书写这样的一个规则:规则所定义的命令不是去创 ...
- Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践
Makefile的工作流程 http://c.biancheng.net/view/7091.html Makefile文件是什么? 我们教程主要是讲的是 Makefile .很多 Linux(Uni ...
- Makefile目标,伪目标,头文件自动依赖
目标 即我们最终要生成的文件,make默认生成第一个目标,注意 makefile中tab和空格不是一回事,规则使用tab缩进,编辑器不要设置诸如"将tab替换为空格之类的选项",目 ...
- makefile中的伪目标
伪目标就是总是被执行的目标,相对于目标来说,伪目标不会去考虑它的依赖的时间戳与自己时间戳的新旧关系,从而决定是否执行规则.伪目标格式: .PHONY:clean clean: -rm *.o 在mak ...
- makefile中伪目标的理解
1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command - - 2. 假如编译两个文件可以这么写: a.o:a.c gcc -c ...
- 第三篇 makefile的伪目标
我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下: 1.make将makefile的目标认为是一个文件: 2.make解释器比较目标文件和依赖文件的新旧关系,决定是否 ...
- Makefile编写 三 伪目标的作用
本节我们讨论一个Makefile中的一个重要的特殊目标:伪目标. 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们也可以将一个伪目标 ...
随机推荐
- jqgrid 自定义文本框、选择框等查询
要实现jqgrid的自定义查询可通过表格获取查询的条件,再给jqgrid表格发送postData参数. HTML: <table id="querytable" border ...
- Wireshark中的Checksum: 0x90c5 [validation disabled]问题
Wireshark中的Checksum: 0x90c5 [validation disabled]问题 废话不多说先上问题图: 这是我在做关于DNS协议PPT的时候出现的协议树第五项展开结果,可以发现 ...
- 微信DLL劫持反弹shell复现
(该文参考网络他人资料,仅为学习,不许用于非法用途) 一.操作环境 Windows7 : 微信 , Process Explorer(任务管理工具,本实验中用于查找微信程序调用的DLL文件) Ka ...
- 【小白学AI】随机森林 全解 (从bagging到variance)
文章转自公众号[机器学习炼丹术],关注回复"炼丹"即可获得海量免费学习资料哦! 目录 1 随机森林 2 bagging 3 神秘的63.2% 4 随机森林 vs bagging 5 ...
- SpringCloude简记_part3
18. SpringCloud Alibaba Sentinel实现熔断与限流 18.1 Sentiel 官网 https://github.com/alibaba/Sentinel 中文 https ...
- lammps-MD整体思路
1.收敛性测试 (1)由不同尺寸模型(不同的原子数)和E的关系曲线,再确定尺寸n*n*n: 2.优化结构(nve-nvt-npt) 系综的实现方式(相关命令):https://www.cnblogs. ...
- 3d相册展示
示例代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- secureCRT中sftp的使用
securecrt 按下ALT+P就开启新的会话 进行ftp操作.输入:help命令,显示该FTP提供所有的命令pwd: 查询linux主机所在目录(也就是远程主机目录)lpwd: 查询本地目录(一般 ...
- WPF Devexpress ChartControl CrosshairLabel显示内容居右
源码可加Q群:580749909. 一.解决的问题 ChartControl中希望CrosshairLabel的内容据右 or 自定义 二.实现. 多个显示实例(实例:条形,线形,点等等)下的内容设置 ...
- JS - 对金额数字实现千分位格式化处理
添加千分位处理: function fmoney(s, n) { n = n > 0 && n < = 20 ? n : 2; s = parseFloat((s + &q ...