c++ - makefile 延迟变量扩展

标签 c++ makefile

我的根 makefile 中有一些规则如下所示:

DEPS += a
DEPS += b
...

$(THE_BINARY) : $(DEPS)

在提供一些必需的变量后,单个应用程序生成文件包含此根生成文件。我想这样做,以便应用程序也可以添加到 DEPS 变量。这有效:

DEPS += some_other_dep
include root.make

但这不是:

include root.make
DEPS += some_other_dep

这是因为 ($DEPS) 在分配规则的位置展开,而不是在末尾展开吗?有没有一种方法可以让 DEPS += ... 行做同样的事情来编写根 makefile?

最佳答案

Aggieboy 对这个问题的评论是正确的:如果您首先包含 makefile,那么在您添加额外内容之前使用 $(DEPS) 的规则已经展开,所以它看不到额外的东西。对于使用常见包含文件编写此类 makefile 环境的人,我的建议是定义任何规则的包含文件应始终放在末尾。

.SECONDEXPANSION 确实可以解决这个问题,如果您想那样做的话,而且它实际上并不难理解。如果description in the manual太难读了,看看this discussion of expansion in GNU make可能会有用,特别是 secondary expansion 上的那个.

我通常不推荐这个,因为虽然它会解决这个问题,但你会在下一个规则中遇到同样的问题......你基本上必须对所有的东西使用二次扩展你的规则,如果你想允许 include 文件以任何顺序 WRT 变量分配。并且,二次扩展仅适用于先决条件列表中使用的变量。如果您想推迟扩展用于/作为目标的变量,那您就不走运了。

关于c++ - makefile 延迟变量扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28328794/

相关文章:

compiler-construction - 无法编译 C++ 项目(宏 "max"传递了 3 个参数,但只需要 2 个)

makefile - ' @' doesn' t 工作,如何停止 makefile 中 if..fi 之间的回显?

c - 名称中包含目标文件的 GNU Makefile 默认值变量

c++ - Kinect body 跟踪 GetAndRefreshBodyData 返回错误

c++ - 检查 qprocess 是否已经完成

c++ - 为什么 gcc 编译器将版本插入数据部分?

c++ - 加快 g++ 编译时间

makefile - 为什么 'make' 在 Lion 上失败?

c++ - RegOpenKeyEx 访问拒绝读取 HKEY_LOCAL_MACHINE

c++ - 通过函数传递引用安全吗?