gpt4 book ai didi

makefile - makefile中的%和*有什么区别

转载 作者:行者123 更新时间:2023-12-02 14:42:29 24 4
gpt4 key购买 nike

GNU make manual不擅长解释这部分,我找不到解释或者我无法推断其他地方的信息。

我意识到 % 是一种通配符,但是在 targets 的上下文中 %* 之间有什么区别依赖项命令?我可以在哪里使用它?它在任何地方都具有相同的含义吗?

target: dependencies ...
commands

最佳答案

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

扩展Wildcard pitfall您已经发现的手册中的示例,

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

您可以将其改写为 * 匹配每个 个匹配文件,而 % 匹配任何 个匹配文件。

关于makefile - makefile中的%和*有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34219186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com