【问题标题】:What's the difference between * and % in make?make 中的 * 和 % 有什么区别?
【发布时间】:2013-12-02 09:30:20
【问题描述】:

根据文档,我无法分辨两者之间的区别。似乎它们中的任何一个都可以在先决条件、目标和变量中使用以达到相同的结果。

【问题讨论】:

    标签: makefile gnu


    【解决方案1】:

    引用manual:

    $%

    目标成员名称,当目标是存档成员时。看 档案。例如,如果目标是 foo.a(bar.o),那么 ‘$%’ 是 bar.o 和“$@”是 foo.a。当目标不是 存档成员。

    $*

    隐式规则匹配的词干(参见How Patterns Match)。 如果目标是 dir/a.foo.b 并且目标模式是 a.%.b 那么 茎是 dir/foo。词干对于构造相关名称很有用 文件。在静态模式规则中,词干是文件名的一部分 匹配目标模式中的“%”。 (手册中有更多详细信息。)

    * 在目标或先决条件列表中使用时为file glob wildcard

    % 在目标和先决条件中使用时是static pattern rule 或普通pattern rule 中的模式通配符。

    所以$* 变量与该规则的目标和先决条件中匹配的 % 具有相同的内容。

    $% 变量用于处理归档目标。

    * 在目标和先决条件中使用时是文件名通配符。

    【讨论】:

    • 因此,在这种情况下:stackoverflow.com/questions/2483182/… % 用于静态模式规则中,以便从目标生成先决条件,该目标由$(MP3_FILES) 中的patsubst 调用,可以调用make all,对吗?
    • patsubst 将 flac 文件名转换为 mp3 文件名。 mp3/%.mp3: flac/%.flac 位是一个普通模式规则(如果他们愿意,他们可以使用静态模式规则),它表示您被要求构建的任何文件与 mp3/%.mp3 模式匹配,该模式具有 @ 的先决条件文件987654336@ 运行以下规则。在all 目标的先决条件列表中包含$(MP3_FILES) 意味着make all 将尝试构建所有这些mp3 文件。
    • 那么如果它被写成一个静态模式规则,那么同样的事情可以用更少的代码来完成吗?另外,如何使用静态模式规则编写?
    • 在那种特定情况下不会改变任何东西,我可以告诉静态模式规则主要只是将模式规则应用程序限制为列出的目标。 $(MP3_FILES): mp3/%.mp3: flac/%.flac
    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 2010-11-14
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2021-11-04
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多