使用 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.h
,app
依赖于 foo.o
.
自动依赖生成可以处理第一个依赖;编译器在 main.c
中找到 #include "foo.h"
并记录下来。
您必须处理的第二个依赖项。编译器和 Make 都不能推断出它。 (请记住,并非每个头文件都有一个名称匹配的相应源文件。)
不,main.c
不依赖于 foo
。更确切地说 main.c
除了文本编辑器之外不依赖于任何东西。 main.o
依赖于 main.c
和 foo.h
,因为编译 main.o
需要这些文件。您最终的二进制文件应该依赖于 main.o
和 foo.o
链接在一起,但需要明确说明 - make
和链接器都不会发现您想要一起构建的文件。
这个自动依赖性给你的是当 foo.h
改变时,main.o
将需要重新编译(因为这包含在 main.c
中),即使 main.c
本身没有任何变化
我在网上找到了很多方法可以使用 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.h
,app
依赖于 foo.o
.
自动依赖生成可以处理第一个依赖;编译器在 main.c
中找到 #include "foo.h"
并记录下来。
您必须处理的第二个依赖项。编译器和 Make 都不能推断出它。 (请记住,并非每个头文件都有一个名称匹配的相应源文件。)
不,main.c
不依赖于 foo
。更确切地说 main.c
除了文本编辑器之外不依赖于任何东西。 main.o
依赖于 main.c
和 foo.h
,因为编译 main.o
需要这些文件。您最终的二进制文件应该依赖于 main.o
和 foo.o
链接在一起,但需要明确说明 - make
和链接器都不会发现您想要一起构建的文件。
这个自动依赖性给你的是当 foo.h
改变时,main.o
将需要重新编译(因为这包含在 main.c
中),即使 main.c
本身没有任何变化