Makefile中的?= := += =的区别

Makefile编写的时候会需要定义一些变量,这时候就需要用到“=”也就是C语言中的赋值符号来进行赋值,但有时候也会遇到":="和"?=",那么它们的区别是什么呢?

举个例子:

编写一个Makefile

A = "equal"

all:
        @echo $(A)

执行make命令,输出equal。这是普通的变量赋值,用了“=”。有点类似于宏的定义,但与宏定义又有一些区别,修改代码

A = $B "equal"
B = "nocolon"

all:
        @echo $(A)

执行make,输出nocolon equal,所以在使用“=”进行变量赋值的时候,如果右边有变量,变量在本句之后定义的,依旧不会报错,会用之后定义的变量来替换。也就是用“=”定义变量的时候,右边如果有变量,则这个变量的定义可以是整个Makefile文件中的任意位置。

修改上述代码

B = "colon"
A := $B "equal"

all:
        @echo $(A)
执行make,输出colon equal,这样看上去是和"="没有区别,但如果调换一下A、B两变量定义的位置呢?

A := $B "equal"
B = "colon"

all:
        @echo $(A)
执行make,输出equal,没有colon,这样就能看出来区别了,使用“:="进行变量的赋值时,如果右边有变量,那么只会使用在这条语句之前定义的变量,如果变量此时未定义,就默认这个变量为空。

所以使用"="和":="的时候,如果右边有变量,则两者有区别,没有变量,两者是没有区别的。那么"?="呢?

B = "question"
A ?= $B "equal"

all:
        @echo $(A)
执行make,输出question equal,修改代码

A ?= $B "equal"
B = "question"

all:
        @echo $(A)
执行make,依旧输出question equal,说明在正常赋值这方面来说,"?="是和"="一样使用的。那它们的不同之处在哪里呢?修改代码

A ="equal"
A ?= "question equal"

all:
        @echo $(A)

执行make,输出结果为equal。说明了使用"?="进行赋值的时候如果该变量已经赋值过了,那么将跳过这一句,使用"="的时候,如果变量已经赋值过了,它会在进行一次赋值。

Makefile编写的时候还有一个+=符号,+=符号又有什么用处呢?

A = "plus"
A += "equal"

all:
        @echo $(A)
执行make,输出结果为plus equal,所以+=的意思和编程语言中的+=用法差不多,是在本变量的后面加上一个字符串。

所以":="和"?="也都是赋值,但都是对"="进行了一定的限制,":="是在右边有变量的时候只是用本句之前定义的变量,"?="是先判断该变量是否定义过,定义过就不覆盖定义了。







  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Makefile,=是最普通的等号赋值符号,它的作用是将右侧的值赋给左侧的变量。例如,变量A=1,表示将1赋值给变量A。 ?=是条件赋值符号,它的作用是只有在变量未定义时才进行赋值。例如,如果变量A未定义,A?=1,那么A的值就是1;如果A已经定义了,那么A?=1就不会起作用,A的值保持不变。 :=是简单赋值符号,它的特点是变量的值决定于它在Makefile的位置,而不是整个Makefile展开后的最终值。这意味着,如果在使用:=进行赋值时,变量的右侧包含了其他变量的引用,那么这些变量的值将在赋值时被解析并赋给左侧的变量。 总结一下: - =是最普通的等号赋值符号,将右侧的值赋给左侧的变量。 - ?=是条件赋值符号,只有在变量未定义时才进行赋值。 - :=是简单赋值符号,变量的值决定于它在Makefile的位置,而不是整个Makefile展开后的最终值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Makefile := ?= += =的区别](https://blog.csdn.net/chenzhen1080/article/details/107135390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Makefile = := ?= += 的使用及区别](https://blog.csdn.net/shenfengchen/article/details/110792431)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值