【问题标题】:Macro name expanded from another macro in makefile从 makefile 中的另一个宏扩展的宏名称
【发布时间】:2014-07-29 01:21:48
【问题描述】:

我有一个格式如下的生成文件。首先我定义我的输出是什么;

EXEFILES = myexe1.exe myexe2.exe

然后我定义这些输出的依赖关系;

myexe1.exe : myobj1.obj
myexe2.exe : myobj2.obj

然后我有一些宏定义了额外的链接依赖项;

DEP_myexe1 = lib1.lib lib2.lib
DEP_myexe2 = lib3.lib lib4.lib

那么我就有了将.obj转为.exe的目标;

$(EXEFILES):
    $(LINK) -OUT:"Exe\$@" -ADDOBJ:"Obj\$<" -IMPLIB:$($($(DEP_$*)):%=Lib\\%)

我想要发生的是(myexe1.exe 的示例)

DEP_$* -> DEP_myexe1
$(DEP_myexe1) -> lib1.lib lib2.lib
$(lib1.lib lib2.lib:%=Lib\\%) -> Lib\lib1.lib Lib\lib2.lib

不幸的是,这不起作用。当我运行make --just-print 时,-IMPLIB: 参数为空。但是,如果我运行 $(warning DEP_$*) 我会得到

DEP_myexe1

当我运行 $(warning $(DEP_myexe1)) 时,我得到了

lib1.lib lib2.lib

所以出于某种原因,make 不喜欢$(DEP_$*) 的组合。也许它不能像这样动态解析宏名称。我该怎么做才能让它发挥作用?有其他选择吗?

【问题讨论】:

    标签: macros makefile


    【解决方案1】:

    $(warning DEP_$*) 在哪里给你DEP_myexe1 作为输出?因为鉴于您的 makefile 上面它不应该。

    $* 是匹配的目标模式的词干。在你的情况下,因为你有明确的目标名称,你没有模式匹配,所以没有词干,所以 $* 总是空的。

    此外,您尝试的扩展次数过多。您正在扩展$* 以直接获取myexe1(假设目前该变量按您预期的方式工作)。然后,您在其前面加上 DEP_ 并使用 $(DEP_$*) 来获得 lib1.lib lib2.lib。然后您扩展该结果$($(DEP_$*)),然后再次扩展该(空)结果(进行替换)$($($(DEP_$*)):%=Lib\\%)

    您想在规则正文中使用$(@:.exe=) 而不是$*,或者使用%.exe 作为目标,然后使用$* 来获取myexe1/myexe2

    然后您想从$($($(DEP_$*)):%=Lib\\%) 中删除两个扩展级别,并改用$(DEP_$*:%=Lib\\%)

    所以(假设您使用模式规则)您最终会得到:

    %.exe:
            $(LINK) -OUT:"Exe\$@" -ADDOBJ:"Obj\$<" -IMPLIB:$(DEP_$*:%=Lib\\%)
    

    【讨论】:

    • 啊哈,我不知道 @ 可以在远离 $ 这样的替换规则中使用。非常感谢。
    • 并回答您的问题,在目标和 EXEFILES 的配方之间。它确实给了我 myexe1,老实说:-S
    • 我不明白关于@ 的第一条评论,我觉得第二条评论难以置信,但是
    【解决方案2】:

    我设法让它工作,而无需以上述方式解析宏。我像这样修改了链接依赖项;

    myexe1.exe : myobj1.obj lib1.lib lib2.lib
    myexe2.exe : myobj2.obj lib3.lib lib4.lib
    

    然后我需要在目标配方中按扩展名过滤这些文件;

    $(EXEFILES):
        $(LINK) -OUT:"$(EXE_PATH)\$@" -ADDOBJ:$(patsubst %, Obj\\%, $(filter %.obj, $^)) -IMPLIB:$(patsubst %, Lib\\%, $(filter %.lib, $^))
    

    $(pathsubst ...) 用于添加相关文件所在的路径。

    对于myexe1.exe,链接命令展开为;

    slink -OUT:"Exe\myexe1.exe" -ADDOBJ: Obj\myexe1.obj -IMPLIB: Lib\lib1.lib Lib\lib2.lib
    

    出于兴趣,我仍然想知道是否可以解析问题中的宏名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多