gpt4 book ai didi

gcc - 当 GNU make 更新 .d 文件时,确切的事件链是什么?

转载 作者:行者123 更新时间:2023-12-04 13:22:44 24 4
gpt4 key购买 nike

考虑以下简单的 makefile:

#------------------------------#
# List all object files #
#------------------------------#
objects := main.o foo.o bar.o baz.o

#------------------------------#
# Define pattern rule #
# for *.c -> *.o #
#------------------------------#
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@

#------------------------------#
# Define the rule to make #
# the end result #
#------------------------------#
.PHONY all
all: myApp.elf

myApp.elf: $(objects)
$(CC) $(objects) -o myApp.elf $(LFLAGS) $(LIBS)

如果您输入命令make all,GNU make 将从目标myApp.elf 开始。它查看所有先决条件 main.ofoo.obar.obaz.o 以及尝试更新它们。

为此,make 使用在 makefile 中间定义的模式规则。此模式规则展开如下:

main.o: main.c
$(CC) -c $(CFLAGS) main.c -o main.o

foo.o: foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o

bar.o: bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o

baz.o: baz.c
$(CC) -c $(CFLAGS) baz.c -o baz.o

到目前为止,还不错。但是您可以清楚地看到缺少依赖项(包括 h 文件)。

我发现一些资源推荐以下方法:

#------------------------------#
# List all object files #
# and all dependency files #
#------------------------------#
objects := main.o foo.o bar.o baz.o
deps := $(objects:.o=.d)

#------------------------------#
# Define pattern rule #
# for *.c -> *.o #
#------------------------------#
%.o: %.c
$(CC) -c $(CFLAGS) -MMD -MP $< -o $@

#------------------------------#
# Define the rule to make #
# the end result #
#------------------------------#
.PHONY all
all: myApp.elf

myApp.elf: $(objects)
$(CC) $(objects) -o myApp.elf $(LFLAGS) $(LIBS)

-include $(deps)

我正在努力思考这种方法。首先 GNU make 读取 makefile 并查找其他包含的 makefile(请参阅 GNU make 手册第 3.5 段“How Makefiles Are Remade”)。尝试更新它可以找到的每个包含的 makefile(在本例中是依赖文件 main.dfoo.dbar.dbaz.d) 在开始执行 makefile 之前。我在下图中总结了这一点:


enter image description here

没错。我没有看到任何将依赖文件指定为目标的规则。

请帮助我了解接下来实际发生的事情。请将您的答案写成一个循序渐进的事件链。如果能深入了解此事,那就太好了。

注意:
当然,编译命令中的 -MMD-MP 参数(请参阅中间的模式规则)会导致创建依赖文件。但是此模式规则的目标是对象文件,而不是依赖项文件。

注意:
我错误地认为 GNU make 有一个隐式规则在这里被激活。但感谢您的评论和回答,我现在知道这是错误的:-)

最佳答案

这是在 make clean 之后运行 make 并且依赖文件尚不存在时发生的情况:

  1. make 读取文本并到达 -include 指令。
  2. 对于-include 指令的每个参数,make 尝试找到一个以它为目标的规则并运行该规则。 make 将此作为 -include 指令处理的一部分。找不到这样的规则,因为您没有提供。
  3. make 尝试读取 -include 指令中指定的文件并跳过那些不存在的文件(在本例中为所有文件)。
  4. make 去构建项目,然后创建那些 *.d 文件。

如果再次运行 make:

  1. [同前]
  2. [同前]
  3. 由于文件现在确实存在,make 会读取它们。
  4. [同前]

您可能会注意到这意味着 make 使用上一次运行的依赖项,这正是它的工作原理。依赖关系滞后于源文件中的更改。不过,这通常不会造成不便,当它确实存在时,删除依赖文件可用于修复构建。

关于gcc - 当 GNU make 更新 .d 文件时,确切的事件链是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47700541/

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