如果将工作目录下所有的.o 文件删除,重新执行 make 将会得到一个类似于没有创建*.o 文件的规则
的错误提示。这当然不是我们所期望的结果(可能在出现这个错误时会令你感到万分迷惑!)。为了达到我们的初衷,在对变量进行定义的时需要使用一些高级的技巧,包括使用wildcard
函数(变量定义为objects=$(wildcard *.o)
)和实现字符串的置换。如何实现字符串的置换,后续将进行详细地讨论。
函数wildcard
之前提到过,在规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数wildcard
,它的用法是:$(wildcard PATTERN...)
。
在 Makefile 中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别。
一般我们可以使用$(wildcard *.c)
来获取工作目录下的所有的.c 文件列表。
复杂一些用法;可以使用$(patsubst %.c,%.o,$(wildcard *.c))
,首先使用wildcard
函数获取工作目录下的.c
文件列表;之后将列表中所有文件名的后缀.c 替换为.o。这样
我们就可以得到在当前目录可生成的.o
文件列表。