这里说明了 在一些情况下 这也是可以使用通配符的

objects =*.o
这种情况是不会展开的
makefile 中的变量是C++/C 中的宏

如果希望展开,可以使用 $(wildcard *.o)

3.4文件搜索

VPATH = src:../headers

make 查找文件的时候 回先查找 src 在查找 ../headers
由冒号 分割

另一个方式是使 vpath 关键字,这种更为ing或
vpath

满足pattern 模式的文件进入dir 目录中去查找
%匹配零或若干字符

比如 vpath %.h ../headers

3.5 伪目标##

.phony
例子:
.phony :clean

多个生成目标的例子

伪目标也可以成为依赖:

3.6##

多目标
\(@ 自动化变量 ![](https://images2018.cnblogs.com/blog/1054453/201804/1054453-20180417193712141-1260725320.png) 其中,-\)(subst output,,\(@)中的“\)”表示执行一个Makefile的函数,函数名为subst,后面的为参数。关于函数,将在后面讲述。这里的这个函数是截取字符串的意思,“\(@”表示目标的集合,就像一个数组,“\)@”依次取出目标,并执于命令。

后面会有详细解释

3.7 静态模式##

写法

展开式

\(< 表示所有的依赖目标价集 \)@ 表示目标集

3.8 自动生成依赖性

mian.o : mian.c defs

cc -M main.c
那么,编译器的这个功能如何与我们的Makefile联系在一起呢。因为这样一来,我们的Makefile也要根据这些源文件重新生成,让Makefile自已依赖于源文件?这个功能并不现实,不过我们可以有其它手段来迂回地实现这一功能。GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,为每一个“name.c”的文件都生成一个“name.d”的Makefile文件,[.d]文件中就存放对应[.c]文件的依赖关系。

目前还看不太懂