为了账号安全,请及时绑定邮箱和手机立即绑定

GNU Makefile变量赋值=,?=,:=和+ =之间有什么区别?

GNU Makefile变量赋值=,?=,:=和+ =之间有什么区别?

慕慕森 2019-09-06 17:15:28
任何人都可以清楚地解释变量赋值在Makefile中是如何工作的。有什么区别: VARIABLE = value VARIABLE ?= value VARIABLE := value VARIABLE += value我已经阅读了GNU Make手册中的部分,但它对我来说仍然没有意义。
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞


懒集

VARIABLE = value

变量的正常设置 - 当使用变量时,不会在声明变量时递归地扩展变量中的值


立即设定

VARIABLE := value

通过简单扩展内部值来设置变量 - 其中的值在声明时间扩展。


设置如果缺席

VARIABLE ?= value

仅在变量没有值时设置变量


附加

VARIABLE += value

将提供的值附加到现有值(如果变量不存在,则设置为该值)


查看完整回答
反对 回复 2019-09-06
?
米脂

TA贡献1836条经验 获得超3个赞

使用=会导致为变量赋值。如果变量已有值,则替换它。使用时,该值将被扩展。例如:


HELLO = world

HELLO_WORLD = $(HELLO) world!


# This echoes "world world!"

echo $(HELLO_WORLD)


HELLO = hello


# This echoes "hello world!"

echo $(HELLO_WORLD)

使用:=类似于使用=。但是,在使用它时,不是在扩展值时,而是在赋值期间扩展它。例如:


HELLO = world

HELLO_WORLD := $(HELLO) world!


# This echoes "world world!"

echo $(HELLO_WORLD)


HELLO = hello


# Still echoes "world world!"

echo $(HELLO_WORLD)


HELLO_WORLD := $(HELLO) world!


# This echoes "hello world!"

echo $(HELLO_WORLD)

使用?=分配一个值的变量当且仅当变量没有被先前分配。如果先前为变量分配了一个空值(VAR=),我认为它仍然被认为是集合。否则,功能完全一样=。


使用+=就像使用一样=,但不是替换值,而是将值附加到当前值,中间有一个空格。如果变量先前已设置:=,我认为它会扩展。我认为,当使用它时,结果值会扩展。例如:


HELLO_WORLD = hello

HELLO_WORLD += world!


# This echoes "hello world!"

echo $(HELLO_WORLD)

如果使用类似的东西HELLO_WORLD = $(HELLO_WORLD) world!,将导致递归,这很可能会结束Makefile的执行。如果A := $(A) $(B)使用了,结果将与使用完全相同,+=因为B扩展了,:=而+=不会导致B扩展。


查看完整回答
反对 回复 2019-09-06
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我建议你用“make”做一些实验。下面是一个简单的演示,展示之间的差异=和:=。


/* Filename: Makefile*/

x := foo

y := $(x) bar

x := later


a = foo

b = $(a) bar

a = later


test:

    @echo x - $(x)

    @echo y - $(y)

    @echo a - $(a)

    @echo b - $(b)

make test 打印:


x - later

y - foo bar

a - later

b - later bar


查看完整回答
反对 回复 2019-09-06
  • 3 回答
  • 0 关注
  • 575 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信