makefile规则中的伪目标

举报
yd_221104950 发表于 2020/12/03 00:19:46 2020/12/03
【摘要】 在makefile规则的一般形式: 目标文件:依赖文件 执行命令 12 说明:执行命令会将依赖文件编译成目标文件。 而“伪目标”不是一个目标文件,只是一个标签而已。由于“伪目标”不是文件,所以 make无法生成它的依赖关系和决定它是否要执行,只能通过在执行make命令时显式地指明这个“目标”才能让其效。 伪目标例子: clean: rm *.o temp 12...

在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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。