c - 在 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)
既工作又给出正确的行为,所以似乎顺序不再重要了?我该如何理解这一点?
解决方案
您会看到两种截然不同的效果。
扩展对当前没有定义的宏的引用会产生一个空字符串。这完全解释了你的
TARGETS
情况。默认情况下,宏主体中的宏引用在使用宏之前不会展开。因此,假设这
LDLIBS
是一个具有这种行为的宏,当make
处理时LDLIBS+=$(STATS_LIBS)
,它会将文字字符添加$(STATS_LIBS)
到 的值中LDLIBS
。它仅在扩展引用时LDLIBS
扩展,使用当时STATS_LIBS
相关的定义。
推荐阅读
- javascript - 如何获取输入类型号的值并放入全局变量JS
- mysql - 窗口函数 ROW_NUMBER() 使用变量 RUNNING TOTAL 更改处理 ORDER BY
- css - 如何右对齐 LINQPad 查询结果中的一列?
- github - 我是否为我们的团队正在尝试做的事情正确设置存储库?
- mongodb - Discord.js MongoDB 添加新对象问题
- java - 在 TextView 中计算并显示结果 - Android Studio, Java
- react-native - 传递参数来路由 React Native
- ibm-watson - 如何关闭语音转文本服务的脏话过滤器
- javascript - 在 DISTINCT 查询和两个表相关查询中添加 COUNT
- javascript - 将 UK EndDate 与 UTC 当前时间进行比较?