文章目录
前言
语法:
$(wildcard PATTERN...)
在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表
一般我们可以使用“$(wildcard *.c)”
来获取工作目录下的所有的.c
文件列表。复杂一些用法;可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”
,首先使用“wildcard”
函数获取工作目录下的.c
文件列表;之后将列表中所有文件名的后缀.c
替换为.o
。这样我们就可以得到在当前目录可生成的.o
文件列表。因此在一个目录下可以使用如下内容的Makefile
来将工作目录下的所有的.c
文件进行编译并最后连接成为一个可执行文件.
#sample Makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
这里我们使用了make的隐含规则来编译.c的源文件。对变量的赋值也用到了一个特殊的符号(:=)。
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
例子
-
建立一个测试目录,在测试目录下建立一个名为sub的子目录
$ mkdir test $ cd test $ mkdir sub
-
在test下,建立
a.c和b.c2
个文件,在sub
目录下,建立sa.c和sb.c2
个文件建立一个简单的Makefile
src=$(wildcard *.c ./sub/*.c) dir=$(notdir $(src)) obj=$(patsubst %.c,%.o,$(dir) ) all: @echo $(src) @echo $(dir) @echo $(obj) @echo "end"
第一行输出:
a.c b.c ./sub/sa.c ./sub/sb.c
wildcard
把 指定目录./ 和 ./sub/
下的所有后缀是c的文件全部展开。第二行输出:
a.c b.c sa.c sb.c
notdir
把展开的文件去除掉路径信息第三行输出:
a.o b.o sa.o sb.o
在
$(patsubst %.c,%.o,$(dir) )
中,patsubs
t把$(dir)
中的变量符合后缀是.c
的全部替换成.o
,
或者可以使用obj=$(dir:%.c=%.o)
效果也是一样的。