红联Linux门户
Linux帮助

求问一个关于makefile中伪目标的使用问题

发布时间:2012-12-17 15:02:11来源:红联作者:lemonliucy
最近在学makefile的编写,遇到一个问题,请各位大牛提点。

在资料里面看到,在makefile里面的依赖关系是当依赖文件比目标文件新的时候,就会更新目标文件,比如:
edit : main.o
cc -o edit main.o

main.o : main.c
cc -o main.c
其中main.o的更新日期比edit要新的话,那么edit就会被重新编译链接。

但是当我看到伪目标的“一次性生成多目标”的功能的时候,问题就来了。
原文是这样:
伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的Makefile需要一口气生成若干个可执行文件,但你只想简单地敲一个make完事,并且,所有的目标文件都写在一个Makefile中,那么你可以使用“伪目标”这个特性:
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
我们知道,Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪目标”。

我理解起来,这里的意思是由于“all”这个伪目标是强制更新的,那么就会发现其他三个依赖文件比这个旧,然后才会更新这三个依赖文件。但是这么一来的话,依赖关系岂不是颠倒过来了,变成依赖文件由于目标文件的关系而被更新了么?
是不是makefile对于“时间依赖”这样的概念是双向的,既要保持目标文件不能比依赖文件旧,又要保持依赖文件不能比目标文件旧?

求各位大神指点啊!!
跪谢!!
文章评论

共有 3 条评论

  1. lemonliucy 于 2012-12-18 14:25:37发表:

    太蛋疼了,感觉很多东西都要学啊……

  2. sunlightboy514 于 2012-12-17 22:03:32发表:

    围观呀,不太懂。。。

  3. ksoeiyrt 于 2012-12-17 21:43:40发表:

    帮顶下