在GNU make
教程中说:
Variables and functions in all parts of a makefile are expanded when read, except for in recipes, the right-hand sides of variable definitions using ‘=’, and the bodies of variable definitions using the define directive.
我编写了以下 make:
CC:=gcc
$(CC)G=-o
TARGET=fmake
fmake: $(TARGET).c
$(CC) $(gccG) $(TARGET) $(TARGET).c
尽管我在变量定义的右侧使用“=”并在配方中使用了 varibale,但它正确编译了我的 .c
源文件。
最佳答案
如果交换前两行的顺序,也许会更容易解释会发生什么:
$(CC)G=-o
CC:=gcc
在第一行中,变量$(CC)出现在左侧,因此在读取时立即展开;但您尚未定义该变量,因此它会扩展为空白,最终结果就像您键入了 G=-o
一样。然后当需要扩展 $(gccG)
时,没有该名称的变量,因此也变成空白;因此实际执行的命令是 gcc fmake fmake.c(注意没有标志)。
这种延迟扩展意味着这样的事情:
VAR=$(VAR2)
在读取 $(VAR2) 时不会立即展开;存储的内容是$(VAR2)
。 VAR2 可以稍后更改,然后当 VAR 扩展时,它扩展为 $(VAR2),$(VAR2) 本身也扩展为其新值。
关于c - makefile 的所有部分中的变量和函数在读取时都会展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20929696/