Makefile之二、定义变量并赋值方法(=、:=、?=、+=区别)

本文深入解析Makefile中的变量赋值方法,包括递归赋值、立即赋值、条件赋值和追加赋值的区别,以及延时变量和立即变量的概念。通过实例验证不同赋值方式在变量展开时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备注:
makefile中变量定义直接写就表示定义该变量,例如makefile文件中写如下一行代码:
a
就表示定义变量a,且未赋值。

一、变量赋值方法(赋值运算符)

赋值运算符:

=
?=
:=
+=
define

二、变量赋值两种类型

makefile中变量赋值分为两种方式:延时变量和立即变量

2.1、延时变量

延时变量表示:使用该变量的时候,才展开该变量,并确定该变量的值(如 “=”、“?=”、“define”定义的变量)

2.2、立即变量

立即变量表示:定义的时候就已经确定了该变量的值(如“:=”定义的变量,即:=表示立即对变量赋值,并且会覆盖前面的值


三、 = 与 := 与 ?= 与 += 的区别

符号含义变量类型
=递归赋值,当变量展开时,优先从后面展开延时变量
:=该变量立即赋值(会覆盖前面的值),当变量展开时,优先从前面展开立即变量
?=若前面没有定义该变量,则此处赋值,如果前面已经定义了,则此处不再赋值延时变量
+=追加赋值立即变量

敲黑板!!!

= 赋值,写在后面的语句优先展开,直到全部展开
:=赋值,写在前面的语句优先展开,直到全部展开

四、举例验证

x = before
y = $(x)_AAAA
x = later

xx := before
yy := $(xx)_AAAA
xx := later 

.PHONY:all
all:
>---@echo "\$$(x)  = $(x)"
>---@echo "\$$(xx) = $(xx)"
>---@echo "x  = $(y)"
>---@echo "xx = $(yy)"

执行make,结果如下

lsy@ubuntu18:~$ make
$(x)  = later
$(xx) = later
x  = later_AAAA
xx = before_AAAA

结果分析:
1、无变量嵌套,无需展开:
x和xx最终值都是later,因为语言是从上往下执行的。

2、赋值有变量嵌套,需要展开:
x = later_AAAA,表示 =赋值从后面进行展开,即:后面的优先展开
xx = before_AAAA,表示 :=赋值从前面进行展开,即:前面的优先展开

敲黑板!!!

分析makefile的时候:

碰到变量需要展开,如果是=,则先往后面查找,如果是:=,则先往前面查找
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值