makefile规则中的伪目标
在makefile规则的一般形式:
目标文件:依赖文件
执行命令
- 1
- 2
说明:执行命令会将依赖文件编译成目标文件。
而“伪目标”不是一个目标文件,只是一个标签而已。由于“伪目标”不是文件,所以 make无法生成它的依赖关系和决定它是否要执行,只能通过在执行make命令时显式地指明这个“目标”才能让其效。
伪目标例子:
clean:
rm *.o temp
- 1
- 2
显式执行“伪目标”:
~/Desktop/mydir$ make clean
- 1
为了避免“伪目标”名称与文件名称重名,可以使用一个特殊标记“.PHONY”来显式声明“伪目标”,不管是否有这个文件,make命令都一定会把它当作“伪目标”看待。
.PHONY : clean
- 1
综合上所述,修改后的“伪目标”:
.PHONY : clean
clean :
rm *.o temp
- 1
- 2
- 3
一般来说,“伪目标”都没有依赖的文件。其实,它也是可以为“伪目标”指定依赖文件的。
“伪目标”同样可以作为“默认目标”,只要将其放在makefile开头。Makefile 中的第一个目标会被作为makefile的默认目标。而且默认目标总会被执行的。
当需要Makefile一次生成若干个可执行文件,且所有目标文件都写在同一个 Makefile中,就可以使用这种方式:
all:main1 main2
.PHONY : all MAIN_1_OBJ = main.o hello.o car.o
main1: $(MAIN_1_OBJ) gcc -o main1 $(MAIN_1_OBJ)
main.o hello.o:hello.h
main.o car.o:car.h
main2:main2.o gcc -o main2 main2.o
.PHONY:clean
clean: -rm main1 main2 $(MAIN_1_OBJ) main2.o
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
上述声明了一个“all”的伪目标,依赖于其它两个目标main1 main2。因为“all”是一个伪目标,而伪目标只是一个标签不会生成文件,所以不会有“all”文件产生。但是由于默认目标总是会被执行的,所以两个目标文件main1 main2都会被生成出来。
.PHONY : all 声明“all”为“伪目标”,即使不写这一句, make也可以通过隐式规则推导出来。建议写上。
通过上面我们可以看到目标文件可以成为依赖,其实“伪目标”同样也可成为依赖,如:
.PHONY:cleanall cleanobj cleanapp
cleanall:cleanobj cleanapp
cleanobj: -rm $(MAIN_1_OBJ) main2.o
cleanapp: -rm main1 main2
- 1
- 2
- 3
- 4
- 5
- 6
完整示例:
all:main1 main2
.PHONY : all
MAIN_1_OBJ = main.o hello.o car.o
main1: $(MAIN_1_OBJ) gcc -o main1 $(MAIN_1_OBJ)
main.o hello.o:hello.h
main.o car.o:car.h
main2:main2.o gcc -o main2 main2.o
.PHONY:cleanall cleanobj cleanapp
cleanall:cleanobj cleanapp
cleanobj: -rm *.o
cleanapp: -rm main1 main2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
演示
~/Desktop/mydir$ make
~/Desktop/mydir$ make cleanobj
rm main.o hello.o car.o main2.o
~/Desktop/mydir$ make cleanapp
rm main1 main2
~/Desktop/mydir$ make
cc -c -o main.o main.c
cc -c -o hello.o hello.c
cc -c -o car.o car.c
gcc -o main1 main.o hello.o car.o
cc -c -o main2.o main2.c
gcc -o main2 main2.o
~/Desktop/mydir$ make cleanall
rm main.o hello.o car.o main2.o
rm main1 main2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
make cleanobj:删除所有.o文件
make cleanapp:删除所有可执行文件
make cleanall:删除所有.o文件和所有可执行文件
谢谢阅读
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/103134990
- 点赞
- 收藏
- 关注作者
评论(0)