gcc - 使用 GCC 和 GNU Make 自动生成依赖项有何用处?
问题描述
我在网上找到了很多方法来使用-M
GCC(或 G++)的 -type 标志来自动在 Makefile 中生成依赖项。所有方法看起来都相似,我实现了这个。
我能找到的所有支持的论点都是这样的:它可以帮助您,因为您不必手动管理依赖项。 我不明白为什么。
考虑以下文件:
主程序
#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.c
,它不依赖于任何东西,只依赖于文本编辑器。这main.o
取决于main.c
并且foo.h
因为这些文件是编译所必需的main.o
。您的最终二进制文件应该依赖main.o
并foo.o
链接在一起,但需要明确说明 -make
链接器都不会找出您想要一起构建的文件。
这种自动依赖性给您的是这样的符号,即当更改时,即使它本身没有任何更改foo.h
,main.o
也需要重新编译(因为它包含在 中)。main.c
main.c
推荐阅读
- android - 将admob gradle添加到android应用程序时出现依赖冲突错误
- angular - 如何以角度从 httpInterceptor 错误处理程序服务获取组件名称?
- vb.net - 如何格式化从目录中检索并在 vb.net 的 datagridview 中显示的文本文件值
- google-apps-script - 批处理功能时谷歌脚本代码运行缓慢
- spring - Redis 缓存内存状态
- bash - 如何使用 sed 或 awk 在文件的特定行插入特定字符?
- python - 如何在 scikit-learn 中使用交叉验证获得预测概率
- c - 如何正确构建具有字符结构的链表
- css - 带进度条的引导输入组
- angular - (激活)事件
当我运行 ng build --prod 时不起作用