生成的依赖问题
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 文件的情况。以上是关于生成的依赖问题的主要内容,如果未能解决你的问题,请参考以下文章