如何在Makefile中使用wildcard
makefile规则会自动展开通配符。 但是,对于变量定义和函数引用,通配符无效。 在这种情况下,如果通配符必须有效,则必须使用函数" wildcard "。 其使用方法为$(wildcard PATTERN . )。 makefile将在以空格分隔的与此模式匹配的所有现有文件的列表中展开。 如果没有与此模式匹配的文件,函数将忽略模式字符并返回空。 需要注意的是,这种情况下规则中通配符的展开和上一小节中通配符的不同。
通常,您可以使用$(wildcard*.c )来获取工作目录中所有. c文件的列表。 复杂的使用方法; 您可以先使用$(patsubst%.c,%.o,$ ) wildcard*.c,然后使用wildcard函数获取工作目录中. c文件的列表。 然后,用. o替换列表中所有文件名的后缀. c。 这样就得到了可以在当前目录中生成的. o文件的列表。 因此,可以在单个目录中使用以下makefile来编译工作目录中的所有. c文件,最后将其连接到可执行文件:
#示例标记文件
Objects:=$(Patsubst%.c,%.o,$(wildcard*.c ) )
foo : $(objects )
cc -o foo $(objects )
在这里,我们使用了make的隐式规则来编译. c的源文件。 对变量的代入也使用了特别的符号(:=)。
1、通配符:扩展通配符
2、notdir :去除路径
3、patsubst :替换通配符
示例:
创建测试目录,然后在测试目录下创建名为sub的子目录
$ mkdir test
$ cd test
$ mkdir sub
在test下创建a.c和b.c两个文件,在sub目录下创建sa.c和sb.c两个文件
制作简单的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 ) )中,patsubst为$ ) dir )的变量将与后缀. c匹配的所有内容替换为. o。
任何输出。
或可以使用
obj=$(dir:%.c=%.o )
效果也一样。
在此使用makefile的替换引用规则。 也就是说,用指定的变量替换其他变量。
标准的格式是
${var:a=b}或${var:a=b}
这意味着将变量var中每个值的末尾a替换为b
今天研究makefile的时候,在网上看到了一篇报道。 介绍了如何使用函数wildcard获得指定目录中所有c语言源程序的文件名。 现在,您不再需要手动指定需要编译的. c文件。 方法如下。
SRC=$(wildcard *.c )
指定编译当前目录中的所有. c文件,如果有子目录,例如inc,请添加wildcard函数,如下所示:
SRC=$(wildcard*.c ) $(wildcard inc/*.c ) )。
也可以指定程序集资源。
ASRC=$(wildcard *.S )
从3http://blog.csdn.net/Liang Kaiming/article/details/6267357