生成的依赖问题

Posted

技术标签:

【中文标题】生成的依赖问题【英文标题】:Generated Dependencies issue 【发布时间】:2019-10-05 17:22:55 【问题描述】:

我使用以下目标为我的项目生成了依赖项。

只编译生成的依赖的第一行。

然后,我的主文件依赖于我项目中的所有源文件; 有什么想法吗?

我的依赖文件是这样生成的:

rules.d : $(wildcard *.c) $(wildcard *.h)
        gcc -MM $(wildcard *.c) > rules.d

然后我做了

-include rules.d

然后只编译第一个生成的依赖项。 rules.d 包含例如

main.o:main.c *.h
a.o=a.c
b.o=b.c
c.o=c.c

我们在项目中有以下文件

a.h a.c 
b.h b.c 
c.h. c.c

main.c(包含main函数),包含所有头文件。 我以这种方式拆分我的项目,因为这是团队的强制要求。

任何帮助将不胜感激。

【问题讨论】:

您能否澄清一下问题:“仅编译生成的依赖项的第一行。” ? 我不明白为什么人们会到处将这些问题标记为“接近”,因为它们“与编程无关”。在哪个领域,编写 makefile 不算编程? 我无法重现您的情况。我也无法理解您是如何在rules.d 文件中获得结果的。我从来没有听说过gcc 将像a.o=a.c 这样的变量赋值生成到依赖列表中。我也从未见过它会生成像*.h 这样的通配符先决条件。您确定您确实正确地将文件内容剪切并粘贴到您的问题中吗?如果是这样,您的 makefile 中肯定有比您在此处提供的更多内容。 在提问时,最好显示您输入的用于调用make 的命令行,以及您获得的(相关)输出,以及它不是什么方式的具体描述你想要的。 @dash-o rules.d 有 main.o: *.h main.c / a.o:a.c / b.o:b.c / c.o:c.c 。只有第一部分是通过 gcc 评估的,这将导致 main.o only 【参考方案1】:

当你说只编译第一个依赖项时,我假设你的意思是当你运行make时,只编译main.o或生成rules.d

这可能是因为您在makefile 的顶部 添加了include rules.d 和/或构建rules.d 的目标。它应该被添加到你的makefile的end

如果您在没有明确目标的情况下调用make,那么它将构建它在makefile 中找到的第一个目标并停在那里。如果您将构建rules.d 的规则作为makefile 中的第一件事,那么这就是所有将被调用的内容。

【讨论】:

【参考方案2】:

通过以下方式获得所有所需依赖文件的列表后:

SRC := $(wildcard *.c)
OBJ := $(SRC:.c=.o)
DEP := $(SRC:.c=.d)    

然后:

rules.d : $(wildcard *.c) $(wildcard *.h)
<tab>gcc -MM $(wildcard *.c) > rules.d

应该是:

%.d: %.c 
<tab>gcc -MM $< > $@

那么编译语句应该是:

%.o: %.c %.d 
<tab>gcc -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c $< -o $@ -I. 

make 文件末尾的某处应该是:

ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEP)
endif

【讨论】:

注意:如果使用 C++ 源文件,则不要使用 gcc,而是使用 g++gpp 如果任何 '.h' 文件被更新,修改 '%.d' 规则以重新生成可能是有意义的。将涵盖嵌套 .h 文件的情况。

以上是关于生成的依赖问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 makefile 中不生成依赖项?

为 C/C++ 中的项目生成生成文件的依赖项

为不同的输出目录生成 GCC 依赖项

Makefile中自动生成头文件依赖

忽略生成的依赖项

FastAPI 依赖注入详解:生成依赖树