首页 > 解决方案 > 在 Makefile 中定义和使用变量的顺序是否重要?

问题描述

在处理一个迷你项目时,我对 Makefile 的行为有点困惑。在Makefile中,当我有

all: $(TARGETS)

TARGETS = stats

....

make 命令给出“make:Nothing to be done for `all'”。

当我在使用它之前声明 TARGETS 时:

TARGETS = stats
all: $(TARGETS)
....

make 命令编译并按预期工作。

在这里定义变量和调用该变量的顺序似乎很重要。

但后来我发现:

stats: LDLIBS+=$(STATS_LIBS)
STATS_LIBS = -lm

STATS_LIBS = -lm
stats: LDLIBS+=$(STATS_LIBS)

既工作又给出正确的行为,所以似乎顺序不再重要了?我该如何理解这一点?

标签: cmakefile

解决方案


您会看到两种截然不同的效果。

  1. 扩展对当前没有定义的宏的引用会产生一个空字符串。这完全解释了你的TARGETS情况。

  2. 默认情况下,宏主体中的宏引用在使用宏之前不会展开。因此,假设这LDLIBS是一个具有这种行为的宏,当make处理时LDLIBS+=$(STATS_LIBS),它会将文字字符添加$(STATS_LIBS)到 的值中LDLIBS。它仅在扩展引用时LDLIBS扩展,使用当时STATS_LIBS相关的定义。


推荐阅读