Makefile里的PHONY理解和实例

.phony是一个特殊工作目标(special target) , 它用来指定一个假想的工作目标(也就是说phony后面的名字在make之后并不会生成一个相应名字的实际文件)而且肯定要视为未被更新(makefile只有在依赖文件更新之后才会进行再次make,此处未更新的意思是说.phony后面这个名字指定的文件未被更新,意思即生成此文件的条件总是满足,需要处理)

PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:
1 避免和同名文件冲突;

2 改善性能。

all : 8puzzle findpath minpathbucharest tests


minpathbucharest : min_path_to_Bucharest.cpp stlastar.h
	g++ -Wall min_path_to_Bucharest.cpp -o minpathbucharest

8puzzle : 8puzzle.cpp stlastar.h
	g++ -Wall 8puzzle.cpp -o 8puzzle

findpath : findpath.cpp stlastar.h
	g++ -Wall findpath.cpp -o findpath

tests : tests.cpp 8puzzle findpath minpathbucharest
	g++ -Wall tests.cpp -o tests

test: tests
	./tests

#.PHONY: clean
clean:
	rm -rfv 8puzzle findpath minpathbucharest tests

这时候,可以直接 

make clean && make
rm -rfv 8puzzle findpath minpathbucharest tests
g++ -Wall 8puzzle.cpp -o 8puzzle
g++ -Wall findpath.cpp -o findpath
g++ -Wall min_path_to_Bucharest.cpp -o minpathbucharest
g++ -Wall tests.cpp -o tests

但是,创建一个clean的文件之后就不一样了

touch clean
make clean && make 
make: “clean”是最新的。
make: 没有什么可以做的为 `all'。

因为clean文件已经存在,已经是最新的,就是不会重新,不会重新编译。

all : 8puzzle findpath minpathbucharest tests


minpathbucharest : min_path_to_Bucharest.cpp stlastar.h
	g++ -Wall min_path_to_Bucharest.cpp -o minpathbucharest

8puzzle : 8puzzle.cpp stlastar.h
	g++ -Wall 8puzzle.cpp -o 8puzzle

findpath : findpath.cpp stlastar.h
	g++ -Wall findpath.cpp -o findpath

tests : tests.cpp 8puzzle findpath minpathbucharest
	g++ -Wall tests.cpp -o tests

test: tests
	./tests

.PHONY: clean
clean:
	rm -rfv 8puzzle findpath minpathbucharest tests

取消掉这句前面的注释

.PHONY: clean

然后在编译一下,结果就不一样了

make clean && make
rm -rfv 8puzzle findpath minpathbucharest tests
已删除"8puzzle"
已删除"findpath"
已删除"minpathbucharest"
已删除"tests"
g++ -Wall 8puzzle.cpp -o 8puzzle
g++ -Wall findpath.cpp -o findpath
g++ -Wall min_path_to_Bucharest.cpp -o minpathbucharest
g++ -Wall tests.cpp -o tests
至此,应该能比较好的理解PHONY在Makefile中的作用了吧,加油吧,少年!





  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Makefile 中的 wildcard 和 patsubst 是两种重要的函数,它们用于规则定义中的模式匹配。 - wildcard:这个函数用于扩展通配符,并返回与通配符匹配的文件列表。例如,`wildcard *.c` 将返回当前目录下所有以 .c 结尾的文件名列表。 - patsubst:这个函数用于模式匹配和替换,并返回匹配模式的字符串的列表,其中部分字符被替换为指定的字符串。例如,`patsubst %.c,%.o,$(wildcard *.c)` 将返回所有以 .c 结尾的文件名,并将 .c 替换为 .o。 这两个函数在 Makefile 中经常被用于自动生成依赖关系和生成规则。 ### 回答2: makefile 中的 wildcard 和 patsubst 是两个用于模式匹配的关键字。 1. wildcard:wildcard 是通配符函数,用于查找指定目录下符合指定模式的文件名。使用的语法是$(wildcard pattern),其中 pattern 是文件名的模式,可以包含通配符字符 * 和 ?。wildcard 函数会返回符合模式的文件名列表。 例如,如果有一个目录下有三个文件:file1.txt、file2.txt 和 file3.csv,可以使用 wildcard 函数来查找所有以 .txt 结尾的文件名: ```makefile TXT_FILES := $(wildcard *.txt) ``` 上述代码会将符合模式的文件名列表赋值给变量 TXT_FILES,最终结果为 "file1.txt file2.txt"。 2. patsubst:patsubst 是模式替换函数,用于根据指定的模式匹配规则替换字符串。使用的语法是$(patsubst pattern,replacement,text),其中 pattern 是要匹配的模式,replacement 是替换的内容,text 是要进行替换的原始文本。 例如,如果有一个变量包含了文件名列表,可以使用 patsubst 函数将其中的 .txt 后缀替换成 .csv: ```makefile FILENAMES := file1.txt file2.txt file3.txt CSV_FILENAMES := $(patsubst %.txt,%.csv,$(FILENAMES)) ``` 上述代码会将 FILENAMES 中的每个文件名进行模式匹配,将其中 .txt 替换成 .csv,然后赋值给变量 CSV_FILENAMES,最终结果为 "file1.csv file2.csv file3.csv"。 通过使用 wildcard 和 patsubst,可以方便地在 makefile 中进行文件名的模式匹配和替换,从而实现更灵活的文件操作。 ### 回答3: 在makefile中,wildcard和patsubst是两个非常有用的函数,用于处理文件名模式匹配和字符串替换。 wildcard函数用于获取当前目录下符合特定模式的文件列表,其语法为:$(wildcard pattern),其中pattern是文件名匹配模式。 例如,假设当前目录下有三个文件:file1.txt、file2.txt和file3.txt。我们可以使用$(wildcard *.txt)来获取所有以.txt结尾的文件列表。返回的结果为:"file1.txt file2.txt file3.txt"。 patsubst函数用于进行字符串的模式替换,其语法为:$(patsubst pattern,replacement,text),其中pattern是要匹配的模式,replacement是要替换的内容,text是要进行替换操作的字符串。 例如,我们可以使用$(patsubst %.txt,%.md,file1.txt)将文件名的后缀从.txt替换为.md。返回的结果为:"file1.md"。 另外,通常我们可以将wildcard和patsubst结合使用,以便在makefile中处理一组符合特定模式的文件。 例如,我们可以使用以下语句来定义一个变量,其中包含所有以.c结尾的文件,并将后缀替换为.o: ``` SRC_FILES := $(wildcard *.c) OBJ_FILES := $(patsubst %.c,%.o,$(SRC_FILES)) ``` 上述语句会将当前目录下所有以.c结尾的文件保存在SRC_FILES变量中,并将文件名的后缀替换为.o保存在OBJ_FILES变量中。 通过理解和使用wildcard和patsubst函数,我们可以更加灵活和高效地处理文件名和字符串的模式匹配、替换和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fttony2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值