【发布时间】:2019-05-14 05:17:12
【问题描述】:
我继承了一个大型的分支项目?这需要将一组易失的 .a 档案 $(LIB_FILES) 包含在链接目标中,该链接目标位于某些目录 $(LIB_DIRS) 中。我可以这样写一个表达式:
LIBDEP = $(foreach ldir, $(LIB_DIRS), \
$(filter $(addprefix %/, $(LIB_FILES)), $(wildcard $(ldir)/* )))
问题是它们可能在 make 调用时不存在,而是通过在另一个目标的规则中调用 $(MAKE) 来构建,这是链接步骤的先决条件。
问题是应该创建的文件的实际列表因构建步骤中确定的外部因素而异,我无法正确地对其进行硬编码,而不会将 makefile 变成意大利面条式的混乱,并且不会重新评估所述变量在链接命令调用的那一刻。
我怀疑 $(eval ) 函数可以以某种方式使用,但是手册不是很及时,而且我没有找到以这种方式使用它的示例。
工具链:GCC 和 binutils,制作 3.81
【问题讨论】:
-
你的意思是,它出现在链接规则的先决条件中?
-
@Vroomfondel no,作为命令的参数
-
看到您的回复为时已晚 - 虽然我的回答有效,但我认为您的问题出在其他地方。您正在使用一个递归变量,该变量仅在使用时才会扩展 - 因此,如果在调用链接命令时存在错误/缺失的库,那么 there are 错误/缺失的库。
-
另一种可能性是您的 makefile 对自己撒谎,并且链接时
$(LIB_FILES)的内容并没有真正显示要链接的内容。 -
@Vroomfondel 不,它没有,libfiles 是可能的文件名列表,但没有信息可能是它们的确切位置(不是完整路径,同名文件可能存在于多个目录中)。它总是在第二次运行时正确链接。这是一个带有自注册子系统的有点奇怪的 ECS 架构。复制粘贴而不寻找后果的程序员的遗产