赋值符“=” “:=” “?=” “+=”
=
a = aaa
b = $(a)
a = bbb
test:
@echo "a=$(a)"
@echo "b=$(b)"
# a=bbb
# b=bbb
# 为什么会这样因为 a是递归赋值,就是最下面的那个赋值就是他的真正赋值
# 所以不管a=aaa为多少都是a=bbb
:=
a := aaa
b := $(a)
a := bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
# a -> bbb
# b -> aaa
# 为什么出现这种情况,:=就是c语言的正常赋值,后面的会把前面的覆盖,但是不会在赋值的时候递归
# 是立即赋值
?=
a ?= aaa
b ?= $(a)
a ?= bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
#a -> aaa
#b -> aaa
# ?=就是如果a已经赋值了,就不进行赋值,如果没赋值就进行赋值
a ?=aaa
等价于下面的
ifeq ($(origin a), undefined)
a = aaa
endif
本质和c语言中的
#ifndef a
#define a aaa
#endif
+=
#情况1
a += aaa
b += $(a)
a += bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
# 理论上以为这种出现的结果是 a -> aaa bbb
b -> aaa
# 实际上 a -> aaa bbb
b -> aaa bbb
上面等价于
a = aaa
b = $(a)
a += bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
解析一下这种就是
a = aaa
b = $(a)
a = aaa bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
前面定义了=不管后面怎么定义都会递归后面的:= +=
为什么会出现这种情况?
如果变量之前没有定义过,那么,
+=
会自动变成
=
,如果前面有变量定义,那么
+=
会继承于前
次操作的赋值符。如果前一次的是
:=
,那么
+=
会以
:=
作为其赋值符
#情况2
a = aaa
b = $(a)
a := bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
# 一开始猜测以为这种是
a -> bbb
b -> aaa
#实际上只要前面是=后面不管是什么:= 还是+= 都会进行递归
a -> bbb
b -> bbb #这时候a已经递归了
#情况3
a = aaa
b = $(a)
a ?= bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
#这种结果就是正常结果,因为a进行递归,?= a已经定义过了,所以结果
a -> aaa
b -> aaa
#情况4
a := aaa
b := $(a)
a += bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
# 犹豫+=会继承第一次变量赋值,所以我们a:=是立即执行 上面等价于
a := aaa
b := $(a)
a := $(a) bbb
test:
@echo "a -> $(a)"
@echo "b -> $(b)"
结果是:
a -> aaa bbb
b -> aaa
总结
我们使用赋值就使用:=这重就是正常c语言的覆盖赋值
变量初次出现不要使用+=,因为使用这个+=就相当于=
就使用一次的变量使用:=与=没有区别,使用多次定义的变量就使用:=
在语句进行只使用:=,和+= ,?=的组合避免出错
a := aaa
b := $(a)
C += dsd bbb=$(a)
test:
@echo "a -> $(a)"
@echo "C -> $(C)"
结果
a -> aaa
c -> dsd bbb=aaa
也就是说以第一个赋值符号为主