在GNU make
教程中说:
makefile的所有部分中的变量和函数在扩展时都会扩展 阅读,除了食谱,变量的右侧 使用'='的定义,以及使用的变量定义的主体 define指令。
我写了以下内容:
CC:=gcc
$(CC)G=-o
TARGET=fmake
fmake: $(TARGET).c
$(CC) $(gccG) $(TARGET) $(TARGET).c
并且它正确编译了我的.c
源文件,尽管我在变量定义的右侧使用'='和配方中的varibale。
答案 0 :(得分:1)
如果你交换前两行的顺序,也许更容易解释会发生什么:
$(CC)G=-o
CC:=gcc
在第一行中,变量$(CC)出现在 left 侧,因此当它被读取时它会立即展开; ;但是你还没有定义变量,所以它扩展为空白,最终结果就像你输入了G=-o
一样。然后,当需要扩展$(gccG)
时,没有该名称的变量,因此也变成空白;所以执行的实际命令是gcc fmake fmake.c
(注意没有标志)。
这种延迟扩张的意思是这样的事情:
VAR=$(VAR2)
在读取时不会扩展$(VAR2);存储的内容是$(VAR2)
。 VAR2可以稍后更改,然后当VAR扩展时,它会扩展为$(VAR2),它本身会扩展为新值。