当前位置:  开发笔记 > 编程语言 > 正文

makefile中%和*之间的区别是什么

如何解决《makefile中%和*之间的区别是什么》经验,为你挑选了1个好方法。

在GNU make手册在解释这一部分不擅长,我找不到解释或者我不能推断其他地方的信息.

我知道%是一种通配符,但之间有什么区别%*的背景下targets,dependenciescommands?我在哪里可以使用它,到处都有相同的含义?

target: dependencies ...
    commands

tripleee.. 7

通配符*仅用于在当前目录中生成匹配文件列表。模式替换字符%是当前可能存在或不存在的文件的占位符。

为了扩展您已经发现的手册中的通配符陷阱示例,

objects = *.o

只是为变量分配了*.o几乎没有用的字面值-一个目标文件,该文件可能依赖于字面命名的文件,而该文件*.c当然也不存在。这样您会得到一个错误和/或不稳定的行为。

正确的表达方式就像

objects := $(patsubst %.c,%.o,$(wildcard *.c))

make本身在这种情况下不执行通配符扩展,但是,当然,如果您将文字值传递*.o给Shell,则在扩展发生时(如果存在匹配项),因此这可能很难调试。 make 在规则的目标中执行通配符扩展,因此您可以说

foo: *.o

并使其完全按照您的预期工作(前提是在评估此依赖项时保证所需文件已存在)。

相比之下,您可以拥有一个带有模式占位符的规则,该规则将用任何匹配的名称填充,以make尝试查找可用于生成所需依赖项的配方。有内置的规则,例如

%.o: %.c
        $(CC) $(CCFLAGS) $^ -o $@

(这里近似真实的东西)说“给定文件匹配%.c,则%.o可以如下生成相应的文件”。在这里,%是一个可以用任何东西代替的占位符;因此,如果将其应用于现有文件,foo.c则会说明如何foo.o生成。

您可以改写为“ *匹配每个匹配文件,同时%匹配任何匹配文件”。



1> tripleee..:

通配符*仅用于在当前目录中生成匹配文件列表。模式替换字符%是当前可能存在或不存在的文件的占位符。

为了扩展您已经发现的手册中的通配符陷阱示例,

objects = *.o

只是为变量分配了*.o几乎没有用的字面值-一个目标文件,该文件可能依赖于字面命名的文件,而该文件*.c当然也不存在。这样您会得到一个错误和/或不稳定的行为。

正确的表达方式就像

objects := $(patsubst %.c,%.o,$(wildcard *.c))

make本身在这种情况下不执行通配符扩展,但是,当然,如果您将文字值传递*.o给Shell,则在扩展发生时(如果存在匹配项),因此这可能很难调试。 make 在规则的目标中执行通配符扩展,因此您可以说

foo: *.o

并使其完全按照您的预期工作(前提是在评估此依赖项时保证所需文件已存在)。

相比之下,您可以拥有一个带有模式占位符的规则,该规则将用任何匹配的名称填充,以make尝试查找可用于生成所需依赖项的配方。有内置的规则,例如

%.o: %.c
        $(CC) $(CCFLAGS) $^ -o $@

(这里近似真实的东西)说“给定文件匹配%.c,则%.o可以如下生成相应的文件”。在这里,%是一个可以用任何东西代替的占位符;因此,如果将其应用于现有文件,foo.c则会说明如何foo.o生成。

您可以改写为“ *匹配每个匹配文件,同时%匹配任何匹配文件”。

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有