在Linux内核Makefile中是:=和+ =相同,可以互换使用吗?如果没有,那么两者之间有什么区别?
答案 0 :(得分:9)
正如其他人所说,:=
是作业。
但:=
和=
之间存在细微差别。在大多数情况下,这并不重要,但它可能会产生很大的不同。
X = $(Y)
将X
定义为递归变量,类似于C预处理器宏。
每当引用X
时,都会使用Y
的值
扩展X
时会发生扩展。因此,您可以在定义Y
后定义X
,这样就可以了。
X := $(Y)
将X
定义为一个简单变量。这更像是C任务
现在,Y
在定义时被扩展,因此稍后更改它将无效。
X += $(Y)
附加到X
,但保留其类型。
如果先前使用X
定义了=
,则Y
不会立即展开。如果从未定义X
,则相同
如果之前使用X
定义:=
,则Y
将立即展开。
你可以试试这个exmaple makefile:
X = 1
Y = $(X)
Z := $(X)
X = 2
Y += $(X)
Z += $(X)
X = 3
test:
@echo "Y = $(Y)"
@echo "Z = $(Z)"
打印
Y = 3 3
Z = 1 2
答案 1 :(得分:3)
:=类似于=,i。这是一项任务。
+ =是一个串联和赋值运算符。
VARIABLE := abc
# here VARIABLE is abc
VARIABLE := def
# VARIABLE is now def only!
VARIABLE_2 = abc
# VARIABLE_2 is now abc
VARIABLE_2 += def
# VARIABLE_2 is abc def
答案 2 :(得分:0)
:=
是作业。 +=
是串联的。见here.
答案 3 :(得分:0)
:=清除您要分配的变量的先前值,而 + =将(连接)添加到变量
例如,假设CFLAGS已设置为-Wundef
如果我们这样做,
CFLAGS := -Wall
CFLAGS现在设置为'-Wall'
如果我们这样做,
CFLAGS += -Wall
CFLAGS现在成为'-Wundef -Wall'
它常用于Linux Makefiles。