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

任何人都可以清楚地解释变量赋值在Makefile中是如何工作的。


有什么区别:


 VARIABLE = value

 VARIABLE ?= value

 VARIABLE := value

 VARIABLE += value

我已经阅读了GNU Make手册中的部分,但它对我来说仍然没有意义。


慕慕森
浏览 580回答 3
3回答

DIEA

懒集VARIABLE = value变量的正常设置 - 当使用变量时,不会在声明变量时递归地扩展变量中的值立即设定VARIABLE := value通过简单扩展内部值来设置变量 - 其中的值在声明时间扩展。设置如果缺席VARIABLE ?= value仅在变量没有值时设置变量附加VARIABLE += value将提供的值附加到现有值(如果变量不存在,则设置为该值)

米脂

使用=会导致为变量赋值。如果变量已有值,则替换它。使用时,该值将被扩展。例如:HELLO = worldHELLO_WORLD = $(HELLO) world!# This echoes "world world!"echo $(HELLO_WORLD)HELLO = hello# This echoes "hello world!"echo $(HELLO_WORLD)使用:=类似于使用=。但是,在使用它时,不是在扩展值时,而是在赋值期间扩展它。例如:HELLO = worldHELLO_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 = helloHELLO_WORLD += world!# This echoes "hello world!"echo $(HELLO_WORLD)如果使用类似的东西HELLO_WORLD = $(HELLO_WORLD) world!,将导致递归,这很可能会结束Makefile的执行。如果A := $(A) $(B)使用了,结果将与使用完全相同,+=因为B扩展了,:=而+=不会导致B扩展。

慕虎7371278

我建议你用“make”做一些实验。下面是一个简单的演示,展示之间的差异=和:=。/* Filename: Makefile*/x := fooy := $(x) barx := latera = foob = $(a) bara = latertest:    @echo x - $(x)    @echo y - $(y)    @echo a - $(a)    @echo b - $(b)make test 打印:x - latery - foo bara - laterb - later bar
打开App,查看更多内容
随时随地看视频慕课网APP