Build 为什么不是';我的Makefile中的eval函数是否正常工作?

Build 为什么不是';我的Makefile中的eval函数是否正常工作?,build,makefile,eval,Build,Makefile,Eval,当我尝试运行以下make文件时(使用以下建议更新): 您可以从输出中看到testVar变量从未设置。我根据我的最后一个问题做了这些更改:有些空格使Make混淆。试试这个: $(foreach cfg_dir,$(configs),$(eval $(call build_template,$(cfg_dir)))) 还要确保指定了要链接的正确对象: $$(cc) -out:$$@ $$(obj_$(1)) -link 正如@Beta在下面的评论中指出的,模板定义语法中的=要求GNU m

当我尝试运行以下make文件时(使用以下建议更新):


您可以从输出中看到testVar变量从未设置。我根据我的最后一个问题做了这些更改:

有些空格使Make混淆。试试这个:

$(foreach cfg_dir,$(configs),$(eval $(call build_template,$(cfg_dir))))
还要确保指定了要链接的正确对象:

    $$(cc) -out:$$@ $$(obj_$(1)) -link
正如@Beta在下面的评论中指出的,模板定义语法中的
=
要求GNU make 3.82或更高版本。因此,最好将其从行中省略:

define build_template

我删除了空格并修复了obj错误,但仍然得到了相同的结果。我使用了-p输出,它看起来根本没有扩展eval。我还在模板中定义了一个变量,并尝试使用警告打印该值,但该值为空。你能推荐其他调试技术吗?奇怪。你用什么牌子的?这是GNU制造的,还是其他的味道?确实很奇怪:使用我的make 3.82,上面的效果很好。您已经删除了所有多余的空格?模式规则也必须以
$$(obj_$(1))
开始,但即使没有它,我也会得到
Makefile:41:testVar“wooo”
。我也不确定这一点(我不太使用
eval
),但我使用3.81,我发现使用
define build\u template=
我得到
Makefile:41:testVar
,但是使用
define build\u template
我得到
Makefile:41:testVar“wooo”
。请注意:您可能希望将那些
$(dir\u guard)
行替换为,以避免对
mkdir
的多余调用。另外请注意,您可能希望在模板中设置编译器标志,而不是从
调试目标继承它们。当前,运行make而不带参数将生成
bin/dbg/MainTest.exe
,因为这是文件中的第一个目标。它将在没有调试标志的情况下执行此操作。即使预先声明了一个目标
all
,也可能需要构建单个目标。最好确保
obj/dbg/
中的任何对象始终使用调试选项进行编译。
    $$(cc) -out:$$@ $$(obj_$(1)) -link
define build_template