在makefile中,$var表示对变量var的引用,makefile会用var变量的值替换掉$var;今天在Makefile中看到了$$var的使用,知其然不知其所以然,学习了一下。
VAR=3 target: prerequsite1 prerequsite2 echo $VAR (1) VAR=4 (2) echo $VAR (3) echo $$VAR (4)在代码段1中,(1)的结果是3,显然makefile利用自己的变量将$VAR扩展成3之后传递给这个echo这个shell命令。
VAR=3 target: prerequsite1 prerequsite2 echo $VAR;\ (1') VAR=4;\ (2') echo $VAR;\ (3') echo $$VAR (4')在代码段2中,所有的shell命令都被连接起来了,那么执行的结果就有变化了:
SUBDIRS=tools examples src target: prerequsite1 prerequsite2 for dir in $SUBDIRS; do $(MAKE) -C $$dir;donemake首先将这个命令扩展成:
for dir in tools examples src; do make -C $dir; done然后交给shell解释执行,可见dir就是一个shell中的变量。
#要使用这个feature就的加上这一行 .SECONDEXPANSION main_objs := main.o try.o test.o lib_objs := lib.o api.o main lib: $$($$@_objs)$$($$@_objs)第一阶段的扩展结果为$($@_objs),第2阶段的扩展结果为:$@被替换为main lib,与_objs连接成main_objs lib_objs。加上外面$的扩展,就是$main_objs $lib_objs,最终结果为main.o try.o test.o lib.o api.o