Makefile常用用法

  1. 伪目标all与.phony用法
  2. $@$^$<用法

伪目标all与.phony用法

最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”,

1
2
`clean:`
rm *.o temp

正像我们前面例子中的“clean”一样,既然我们生成了许多文件编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标)

因为,我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显式地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。

当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显式地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。

1
.PHONY:clean

只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。于是整个过程可以这样写:

1
2
3
.PHONY:clean
clean:
rm *.o temp

伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的Makefile需要一口气生成若干个可执行文件,但你只想简单地敲一个make完事,并且,所有的目标文件都写在一个Makefile中,那么你可以使用“伪目标”这个特性:

1
2
3
4
5
6
7
8
9
10
11
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”又是一个伪目标,伪目标只是一个标签不会生成文件,所以不会有“all”文件产生。于是,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪目标”。(注:这里的显式 “.PHONY : all” 不写的话一般情况也可以正确的执行,这样 make 可通过隐式规则推导出, “all” 是一个伪目标,执行 make 不会生成 ”all” 文件,而执行后面的多个目标。建议:显式写出是一个好习惯。)

随便提一句,从上面的例子我们可以看出,目标也可以成为依赖。所以,伪目标同样也可成为依赖。看下面的例子:

1
2
3
4
5
6
7
8
9
10
.PHONY : cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
rm program

cleanobj :
rm *.o

cleandiff :
rm *.diff

“make cleanall”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点像“子程序”的意思。我们可以输入“make cleanall”和“make cleanobj”和“make cleandiff”命令来达到清除不同种类文件的目的。

1
2
3
4
5
6
7
8
9
10
phony ['fəuni] a. 假的
GNU的make能够使整个软件工程的编译、链接只需要一个命令就可以完成。
makefile的术语:
规则:用于说明如何生成一个或多个目标文件
规则的格式:
targets:prerequisites
command
目标: 依赖
命令
+++++命令需要以[TAB]键开始++++

ref:

跟我一起写Makefile:书写规则:http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:%E4%B9%A6%E5%86%99%E8%A7%84%E5%88%99


$@$^$<用法

Makefile有三个非常有用的变量。分别是$@$^$<代表的意义分别是:

  • $@–目标文件
  • $^–所有的依赖文件
  • $<–第一个依赖文件。`

对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $<

mytool1.o:mytool1.c mytool1.h

gcc -c $<

mytool2.o:mytool2.c mytool2.h

gcc -c $<

1
2
3
4
5
6
7
main:main.o mytool1.o mytool2.o

gcc -o $@ $^

.c.o:

gcc -c $<

from:

http://blog.csdn.net/kesaihao862/article/details/7332528


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wilber_bai@hotmail.com

文章标题:Makefile常用用法

文章字数:1,180

本文作者:风沉殇史

发布时间:2017-12-12, 12:12:12

最后更新:2018-06-21, 16:20:40

原始链接:http://wilber.win/posts/6a162d59/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏