1. $? 表示依赖文件中被修改过的文件
2. objects = $(wildcar *.o) 这个表示统配所有.o文件 ; 而 objects = *.o 表示字符串".o"
3. objects := $(patsubst %.c,%.o,$(wildcard *.c)) 找目录下所有.c文件对应的.o文件作为目标文件
4. 定义变量“VPATH”时,使用空格或者冒号(:)将多个需要搜索的目录分开
5. vpath %.h ../headers
其含义是:Makefile中出现的.h文件;如果不能在当前目录下找到,则到目录“../headers”下寻找。注意:这里指定的路径仅限于在Makefile 文件内容中出现的.h文件。 并不能指定源文件中包含的头文件所在的路径(在.c源文件中所包含的头文件路径需要使用gcc的“-I”选项来指定,可参考gcc的info文档)
其含义是:Makefile中出现的.h文件;如果不能在当前目录下找到,则到目录“../headers”下寻找。注意:这里指定的路径仅限于在Makefile 文件内容中出现的.h文件。 并不能指定源文件中包含的头文件所在的路径(在.c源文件中所包含的头文件路径需要使用gcc的“-I”选项来指定,可参考gcc的info文档)
6. libtest.a : sum.o memcp.o
$(AR) $(ARFLAGS) $@ $^
$(AR) $(ARFLAGS) $@ $^
7. “$^"代表所有通过目录搜索得到的依赖文件的完整路径名
8. “$@"代表规则的目标
9. VPATH = src:../headers
foo.o : foo.c defs.h hack.h
cc -c $(CFLAGS) $< -o $@
自动化变量“$<”代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
foo.o : foo.c defs.h hack.h
cc -c $(CFLAGS) $< -o $@
自动化变量“$<”代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
10. 编译时 -lNAME 会使得先查询“libNAME.so”, 如果没有找到,那么make将会按照以上的搜索顺序查找名字为“libNAME.a”的文件
11. 默认情况时,“.LIBPATTERNS”的值为:“lib%.so lib%.a”。这也是默认情况下在规则存在“-lNAME”格式的依赖时,链接生成目标时使用“libNAME.so”和“libNAME.a”的原因。
12. .PHONY: cleanall cleanobj cleandiff 伪目标