使用:=
在Makefile中使用 := 赋值方式定义变量时,如果该变量定义中包含了其他变量的引用,那么这些引用所表示的值将在变量定义时即被展开。也就是说,子变量会被立即展开,并赋值给父变量。
例如,在 Makefile 中有以下的变量定义:
FOO := A123 BAR := $(FOO) B456 FOO := C789
在这里,变量BAR的值是$(FOO) B456,其中 $(FOO) 表示一个子变量,即它的值是变量FOO的值。因为变量FOO被赋值为A123,所以 BAR 的值为:
A123 B456
此时再将FOO重新赋值为C789,不会影响BAR的值,因为变量BAR已经在 Makefile 中被定义好。
使用 =
和 := 不同的是,使用 = 赋值符号赋值的变量,变量中的子变量引用会在被使用时才被展开。例如:
FOO = A123 BAR = $(FOO) B456 FOO = C789
在这个例子中,变量 BAR 的值仍然是$(FOO) B456,但是因为是使用 = 赋值的方式定义变量,所以在 BAR 在实际使用前,$(FOO) 所表示的值将被展开并赋值给变量 BAR。
因此,此处 BAR 的值是:
C789 B456
总之,使用 := 赋值符号,在Makefile中定义变量时,子变量引用会在变量定义时立即展开;
而使用 = 赋值符号,子变量引用会在变量使用时才被展开。