Makefile的赋值符号的区别

赋值符“=” “:=” “?=” “+=”

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
也就是说以第一个赋值符号为主

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值