日期:2014-05-16  浏览次数:20641 次

求解 Makefile 伪目标的疑惑
陈皓的跟我一起写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这个目标新,为什么会产生这三个文件呢?
------解决方案--------------------
引用:
迷惑中。。。
因为伪目标会被执行,所以肯定比依赖文件新
但是make的工作过程是先比较依赖文件和目标文件,只有依赖文件比目标文件新时才会执行命令
照这个思路all总是比prog1,2,3新的,所以prog作为目标时,便不再被更新,即cc -o prog1 prog1.o utils.o 不会被执行,这样的话怎么产生这三个文件呢

高手给个清晰的解释吧,谢谢

不是这么理解的,依赖关系在目标已存在时才会比较时间新旧。
伪目标是不存在真实文件的,也就是说无法比较时间,每次都必须执行。
所以在这个文件中,all就相当于是 make prog1; make prog2; make prog3