GCC和GNU Make的自动依赖生成是如何有用的?



我在网上找到了许多方法来使用GCC(或g++)的-M-type标志来自动在Makefile中生成依赖项。所有的方法看起来都很相似,我实现了这个。

我能找到的所有支持的参数都是这样的:它帮助你,你不必手动管理依赖项。我不明白为什么。

考虑以下文件:

c

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

foo。

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.c不依赖于任何东西,但文本编辑器。main.o依赖于main.cfoo.h,因为这些文件是编译main.o所必需的。最终的二进制文件应该依赖于main.ofoo.o链接在一起,但它需要明确地声明-make和链接器都不会发现您想要一起构建的文件。

foo.h发生变化时,即使main.c本身没有任何变化,main.o也需要重新编译(因为这是从main.c包含的)。

"我会说main.c依赖于foo.">

不完全;main.o依赖于foo.h,app依赖于foo.o

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

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

最新更新