以下陈述中有何不同之处?
LDDIRS := -L$(ORACLE_LIB)
LDDIRS += -L$(ORACLE_LIB)
答案 0 :(得分:12)
:=(简单扩展变量)扫描值一次,全部展开任何
定义变量时引用其他变量和函数。例如
x:=foo
y:=$(x) bar
x:=later
所以上面相当于
y:=foo bar
x:=later
+ =用于将更多文本附加到变量,例如
objects=main.o foo.o bar.o
objects+=new.o
将对象设置为'main.o foo.o bar.o new.o'
=用于递归扩展变量。值为逐字安装;如果它包含 引用其他变量,只要这个变量是这些变量就会被扩展 这被称为递归扩展。
答案 1 :(得分:9)
" ="用于定义递归扩展变量。以下make文件将打印出来" y稍后是bar"
x = foo
y = $(x) bar
x = later
all:;echo "y is" $(y)
":="用于定义简单扩展变量,它一劳永逸地扩展。以下make文件将打印出来" y is foo bar"
x := foo
y := $(x) bar
x := later
all:;echo "y is" $(y)
另外,正如其他人之前指出的那样,您可以在GNU make手册的Using Variables部分获得更多详细信息。
希望这会有所帮助: - )
答案 2 :(得分:4)
:=
将变量 here 定义为左侧,+=
将右侧添加到变量的现有值。将:=
与=
进行比较,评估使用地点的右侧(而非此特定行)
您可以查看手册here(假设您使用的是GNU make)
答案 3 :(得分:2)
GNU Make has three assignment operators, ":=" , "=", "?=" and one "+=" for appending
to the varibles.
- ":=" performs immediate evaluation of the right-hand side and stores an actual
string into the left-hand side.
eg:
x:=foo
y:=$(x) bar
x:=later
so above is equivalent to
y:=foo bar
x:=later
test above example
x := foo
y := $(x) bar
x := later
all:;echo "y is" $(y)
output
------
y is foo bar
- "=" is like a formula definition; it stores the right-hand side in an
unevaluated form and then evaluates this form each time the left-hand
side is used.
eg:
x = foo
y = $(x) bar
x = later
all:;echo "y is" $(y)
output
------
y is later foo
“?=”仅在未设置/没有值的情况下分配。 例如: KDIR?=“ foo” KDIR?=“ bar” 测试: 回声$(KDIR) 将显示“ foo”
“ + =”用于将更多文本附加到变量。 例如 objects = main.o foo.o bar.o objects + = new.o
这会将对象设置为“ main.o foo.o bar.o new.o”
答案 4 :(得分:0)
:=
Link to place on page 的
语法简单扩展变量由使用':='的行定义(请参阅设置变量)。在定义变量时,一次性扫描简单扩展变量的值,并扩展对其他变量和函数的任何引用。简单扩展变量的实际值是扩展您编写的文本的结果。它不包含对其他变量的任何引用;它包含了定义此变量时的值。
+=
Link to place on page 的
如果之前没有定义相关变量,'+ ='就像普通'='一样:它定义了一个递归扩展变量。但是,当存在先前的定义时,'+ ='的确切取决于您最初定义的变量的类型。有关两种变量的解释,请参见变量的两种风格。
答案 5 :(得分:0)
:=
会将值设置为变量一次,即每次都不会重新评估变量。编译代码时可以在性能上产生巨大的差异。
+=
只会为变量添加一个值。
答案 6 :(得分:-3)
:=
用于分配,方式与=
相同。
+=
为变量添加新值。