我们什么时候在GNU makefile中使用:=和=呢?

我们什么时候在GNU makefile中使用:=和=呢?,makefile,gnu-make,Makefile,Gnu Make,与:=相比,首选=的场景是什么? 在哪些情况下,:=比=更受欢迎? 我从网站上读到,使用=会使运行变慢。我只是想知道,我们什么时候在makefile中使用=呢?对于简单定义的变量,您可以递归地使用变量: ITEMS := one two three ITEMS := $(addsuffix $(ITEMS)) 这是因为简单赋值(:=)是按照您读取它们的顺序进行的 非简单赋值(=)是递归展开的,因此,如果将其赋值给其他变量,它们将依次展开,直到得到包含所有展开部分的最终结果。请注意,makefi

:=
相比,首选
=
的场景是什么?
在哪些情况下,
:=
=
更受欢迎?

我从网站上读到,使用
=
会使
运行变慢。我只是想知道,我们什么时候在makefile中使用
=
呢?

对于简单定义的变量,您可以递归地使用变量:

ITEMS := one two three
ITEMS := $(addsuffix $(ITEMS))
这是因为简单赋值(
:=
)是按照您读取它们的顺序进行的

非简单赋值(
=
)是递归展开的,因此,如果将其赋值给其他变量,它们将依次展开,直到得到包含所有展开部分的最终结果。请注意,makefile首先解析该文件,以便分配的顺序不那么重要,下面的示例如下:

i、 e.这是不允许的:

ITEMS = one two three
ITEMS = $(addsuffix $(ITEMS))
因此,这会影响您何时要使用每种类型。使用non simple,您可以执行以下操作:

ITEMS1 = a b c
ITEMS_all = $(ITEMS1) $(ITEMS2)
ITEMS2 = d e f

现在,所有项目都将包含
a b c d e f
——即使它们没有按顺序定义,这也是非常有用的。因此,如果您只想分配一个简单的值-请坚持使用
:=
如果您想继续向变量添加内容,您可能希望使用
=

简单定义的变量,您可以递归地使用变量:

ITEMS := one two three
ITEMS := $(addsuffix $(ITEMS))
这是因为简单赋值(
:=
)是按照您读取它们的顺序进行的

非简单赋值(
=
)是递归展开的,因此,如果将其赋值给其他变量,它们将依次展开,直到得到包含所有展开部分的最终结果。请注意,makefile首先解析该文件,以便分配的顺序不那么重要,下面的示例如下:

i、 e.这是不允许的:

ITEMS = one two three
ITEMS = $(addsuffix $(ITEMS))
因此,这会影响您何时要使用每种类型。使用non simple,您可以执行以下操作:

ITEMS1 = a b c
ITEMS_all = $(ITEMS1) $(ITEMS2)
ITEMS2 = d e f

现在,所有项目都将包含
a b c d e f
——即使它们没有按顺序定义,这也是非常有用的。因此,如果您只想分配一个简单的值,请坚持使用
:=
如果您想继续向变量添加内容,您可能需要使用
=

来回答您的问题,当您想延迟右侧的扩展,直到变量被使用时,将使用
=

这允许您以任意顺序定义变量。它还允许您使用引用自动变量的值创建变量(请记住,在运行规则之前,自动变量没有值)。例如:

my_FLAGS = -a
your_FLAGS = -b

FLAGS = $($@_FLAGS)

my your : ; @echo $(FLAGS)
如果使用
:=
,则无法执行此操作,因为定义
标志
变量时,
$@
没有值


它们在定义用户定义的函数时也很有用,这些函数以后可以用
$(call…
)调用;您不希望在调用这些变量之前展开它们。

要回答您的问题,当您希望在使用变量之前延迟右侧的展开时,将使用
=

这允许您以任意顺序定义变量。它还允许您使用引用自动变量的值创建变量(请记住,在运行规则之前,自动变量没有值)。例如:

my_FLAGS = -a
your_FLAGS = -b

FLAGS = $($@_FLAGS)

my your : ; @echo $(FLAGS)
如果使用
:=
,则无法执行此操作,因为定义
标志
变量时,
$@
没有值


它们在定义用户定义的函数时也很有用,这些函数以后可以用
$(call…
)调用;在调用它们之前,您不希望对它们进行扩展。

您确定“首先解析文件后”部分吗?如果我没记错的话,每次使用变量时都会发生扩展。你是对的-事实上是递归扩展的:)-我将澄清这一部分,为了示例的上下文,我试图保持它的琐碎性。。。我会更新那部分你确定“先解析文件后”部分吗?如果我没记错的话,每次使用变量时都会发生扩展。你是对的-事实上是递归扩展的:)-我将澄清这一部分,为了示例的上下文,我试图保持它的琐碎性。。。我会更新那部分