求解 Makefile 伪目标的疑惑

snpepgkl 2012-06-05 09:51:51
陈皓的跟我一起写makefile中有这么一段
我们知道,Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪目标”。
all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o

prog2 : prog2.o
cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o

疑惑的是红字部分“其它三个目标的规则总是会被决议,也就达到了我们一口气生成多个目标的目的
按照我的理解,只有依赖文件比目标文件新时才会执行,既然那三个文件不如all这个目标新,为什么会产生这三个文件呢?
...全文
229 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
forevervar 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 2 楼 的回复:

迷惑中。。。
因为伪目标会被执行,所以肯定比依赖文件新
但是make的工作过程是先比较依赖文件和目标文件,只有依赖文件比目标文件新时才会执行命令
照这个思路all总是比prog1,2,3新的,所以prog作为目标时,便不再被更新,即cc -o prog1 prog1.o utils.o 不会被执行,这样的话怎么产生这三个文件呢

高手给个清晰的解释吧,谢谢……
[/Quote]

这样会导致无限执行下去吧?这样的话岂不是有问题,哪位高手来说说
  • 打赏
  • 举报
回复
伪目标的特性是,总是被执行的,这句话怎么理解啊?
louyong0571 2012-06-05
  • 打赏
  • 举报
回复
中文翻译的可能不太准确吧,明白意思就行了。
snpepgkl 2012-06-05
  • 打赏
  • 举报
回复
迷惑中。。。
因为伪目标会被执行,所以肯定比依赖文件新
但是make的工作过程是先比较依赖文件和目标文件,只有依赖文件比目标文件新时才会执行命令
照这个思路all总是比prog1,2,3新的,所以prog作为目标时,便不再被更新,即cc -o prog1 prog1.o utils.o 不会被执行,这样的话怎么产生这三个文件呢

高手给个清晰的解释吧,谢谢
justkk 2012-06-05
  • 打赏
  • 举报
回复
是不是依赖文件都必定会比伪目标新呢?
snpepgkl 2012-06-05
  • 打赏
  • 举报
回复
谢谢6楼
伪目标是不存在真实文件的,这点比较到位
自己想的时候老是考虑新旧关系,钻牛角了
daviddb7 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

迷惑中。。。
因为伪目标会被执行,所以肯定比依赖文件新
但是make的工作过程是先比较依赖文件和目标文件,只有依赖文件比目标文件新时才会执行命令
照这个思路all总是比prog1,2,3新的,所以prog作为目标时,便不再被更新,即cc -o prog1 prog1.o utils.o 不会被执行,这样的话怎么产生这三个文件呢

高手给个清晰的解释吧,谢谢
[/Quote]
不是这么理解的,依赖关系在目标已存在时才会比较时间新旧。
伪目标是不存在真实文件的,也就是说无法比较时间,每次都必须执行。
所以在这个文件中,all就相当于是 make prog1; make prog2; make prog3
snpepgkl 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

中文翻译的可能不太准确吧,明白意思就行了。
[/Quote]

就是因为不明白是什么意思,所以才问的嘛
justkk 2012-06-05
  • 打赏
  • 举报
回复
“由于伪目标的特性是,总是被执行的。所以,其它三个目标的规则总是会被决议。”

这样说可能好理解一些

18,828

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧