前面已经分享了单目录项下多文件的makefile的编写,如今来看看多目录下多文件makefile的编写;函数
在作项目时,通常文件都会分几个目录来存放;基本的是 include/ bin/ src/ obj/ lib/ tools/,这几个文件;我先说下个人文件存放目录,用ls -R能够查看到全部文件:./include/common.h ./src/main.c ./src/printStatus.c 就三个文件,其中*.c 文件都依赖于 *.h文件;工具
一样的先上初版makefile:ui
上面的makefile就是gcc命令的拼凑起来的,下面来分享下比较通用的多目录下的makefile;spa
在看多目录的makefile时,先来理解下几个函数和变量;.net
函数:blog
wildcard 这是扩展通配符函数,功能是展开成一列全部符合由其参数描述的文 件名,文件间以空格间隔;好比:罗列出src下的全部.c文件:$(wildcard ${SRC}/*.c)ip
patsubst 这是匹配替换函数, patsubst ( 须要匹配的文件样式,匹配替换成什么文件,须要匹配的源文件)函数。好比:用src下的*.c替换成对应的 *.o文件存放到obj中:$(patsubst %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))get
notdir 这是去除路径函数,在上面patsubst函数中已经使用过,去除SOURCE中文件的全部目录,只留下文件名;it
变量:class
$@:表示目标文件;通常是在规则中这么用:gcc -o $@ $(object);
$^:表示全部依赖文件;通常是在规则中这么用:gcc -o $@ $^ ;用全部依赖文件连接成目的文件;
$<:表示第一个依赖文件;在规则中使用:gcc -o $@ -c $< ;其实这个时候就是每一个依赖文件生成一个目的文件;
第二版makefile
这个makefile的好处就是通用性,里面不涉及到具体的文件名,当你往src目录中添加新文件时,能够不须要修改makefile,因此这是个很是好的工具;