2

:= 和 += 在 Linux Kernel Makefiles 中是否相同并且可以互换使用?如果不是,那么两者有什么区别?

4

4 回答 4

9

正如其他人所说,:=是任务。

:=但是和之间有很好的区别=。在大多数情况下,这并不重要,但它可能会产生很大的不同。

X = $(Y)定义X为递归变量,类似于 C 预处理器宏。
无论何时X被引用,Y都会使用 的值。
扩展发生在X扩展时。所以你定义Y了之后就可以定义了X,就OK了。

X := $(Y)定义X为一个简单的变量。这更像是一个 C 作业。
现在,Y在定义时已扩展,因此稍后更改它将无济于事。

X += $(Y)附加到X,但保持其类型。
如果X之前用 定义=Y则不会立即展开。如果X从未定义,则相同。
如果X之前用 , 定义:=Y将立即展开。

你可以试试这个例子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
于 2012-07-05T07:53:42.480 回答
3

:= 类似于 =, i。e 这是一项任务。

+= 是一个连接和赋值运算符。

例子:

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
于 2012-07-05T06:50:06.917 回答
0

:=是赋值。 +=是串联。见这里。

于 2012-07-05T06:52:16.417 回答
0

:= 清除您要分配的变量的先前值,而 += 添加(连接)到变量

例如,假设 CFLAGS 已设置为 -Wundef

如果我们这样做,

CFLAGS := -Wall

CFLAGS 现在设置为“-Wall”

如果我们这样做,

CFLAGS += -Wall

CFLAGS 现在变为“-Wundef -Wall”

它经常在 Linux Makefiles 中使用。

于 2013-08-02T21:53:41.380 回答