使用 GCC 和 GNU Make 自动生成依赖项有何用处?

How is automatic dependency generation with GCC and GNU Make useful?

我在网上找到了很多方法可以使用 GCC(或 G++)的 -M 类型标志在 Makefile 中自动生成依赖项。所有的方法看起来都很相似,我实现了 this one.

我能找到的所有赞成的论点都是:它可以帮助您,因为您不必手动管理依赖项。 我不明白为什么。

考虑以下文件:

main.c

#include "foo.h"
int main() { foo(); return 0; }

foo.h

void foo();

foo.c

#include "foo.h"
void foo() { ... }

我会说 main.c 依赖于 foo。但是,当我 运行 make main.o 时,foo 没有建立。依赖文件 main.d 包含(这解释了为什么没有构建 foo ):

main.o: main.c foo.h

foo.h:

现在,如果我要创建一个可执行文件(例如 app: ; $(CC) -o app main.c,有或没有自动依赖生成标志),我仍然需要手动指定它取决于 foo.o.

所以我的问题是:如果我仍然必须指定对 foo.o 的依赖,自动依赖生成如何为我省去任何工作?

“我会说 main.c 取决于 foo。”

不完全是; main.o 依赖于 foo.happ 依赖于 foo.o.

自动依赖生成可以处理第一个依赖;编译器在 main.c 中找到 #include "foo.h" 并记录下来。

您必须处理的第二个依赖项。编译器和 Make 都不能推断出它。 (请记住,并非每个头文件都有一个名称匹配的相应源文件。)

不,main.c 不依赖于 foo。更确切地说 main.c 除了文本编辑器之外不依赖于任何东西。 main.o 依赖于 main.cfoo.h,因为编译 main.o 需要这些文件。您最终的二进制文件应该依赖于 main.ofoo.o 链接在一起,但需要明确说明 - make 和链接器都不会发现您想要一起构建的文件。

这个自动依赖性给你的是当 foo.h 改变时,main.o 将需要重新编译(因为这包含在 main.c 中),即使 main.c本身没有任何变化