我已经连续两天调试这个问题了,我现在要在这里失去理智。我们有一个包含一堆子makefile的主makefile。除其他外,这些子makefile将内容添加到变量 EXTERNAL_LIBS 。
对变量的添加如下所示:
EXTERNAL_LIBS += foo
或者
EXTERNAL_LIBS := bar $(EXTERNAL_LIBS)
我遇到的问题是当我查看 EXTERNAL_LIBS 某些子makefile中添加到此 EXTERNAL_LIBS 变量的值已消失> master makefile中的变量(在包含所有子makefile之后发生),而其他子makefile添加的值仍然存在。我不明白“失去的”价值观发生了什么。
我已经为 EXTERNAL_LIBS 的出现点了我们的整个代码库,以确保它不会被清空或以其他方式覆盖,而事实并非如此。另外,我肯定知道有问题的子makefile会得到评估,因为我已经添加了调试打印输出并通过GNU Make的-d选项完成了跟踪。
有谁知道我在这里做错了什么?顺便说一句,我们在Windows 7机器上使用GNU Make 4.2 for Windows。
编辑:我懂了!!!!根本原因是我对GNU Make功能的不完全了解。此链接(https://www.gnu.org/software/make/manual/html_node/Reading-Makefiles.html)描述了如何初始化变量EXTERNAL_LIBS = bla
当通过+=
附加内容时,将使用延迟扩展,而像这样初始化的变量
EXTERNAL_LIBS := bla
将立即使用扩展。这正是问题所在!一些makefile使用如下语法:
MY_LIB_NAME = <some_fancy_function_call>
...
EXTERNAL_LIBS += $(MY_LIB_NAME)
并且许多makefile以这种方式重用MY_LIB_NAME变量。所以我认为发生的事情是所有这些Makefile都没有添加$(MY_LIB_NAME)的当前值,而是文字字符串“$(MY_LIB_NAME)”,后来扩展到最后一个makefile设置$(MY_LIB_NAME)到。我现在通过初始化变量来切换到立即扩展:
EXTERNAL_LIBS :=
希望这会强制立即扩张。在将值分配给稍后在EXTERNAL_LIBS右侧显示的变量时,我也从=
切换到:=
,这是肯定的。到目前为止,这似乎已经解决了我的问题。上帝,马克将把我带到一个早期的坟墓中。