Makefile中%和*有什么区别

豪尔赫·布卡拉(Jorge Bucaran)

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

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

target: dependencies ...
    commands
三元组

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

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

objects = *.o

如果没有“ .o”文件,则用正确的方式表达类似

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

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

foo: *.o

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

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章