我在网上找到了许多方法来使用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.c
和foo.h
,因为这些文件是编译main.o
所必需的。最终的二进制文件应该依赖于main.o
和foo.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都不能推断它。(请记住,并不是每个头文件都有一个相应的源文件和一个匹配的名称。)