簡體   English   中英

使用 GCC 和 GNU Make 自動生成依賴項有什么用?

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

我在網上找到了很多方法來使用 GCC(或 G++)的-M類型標志來自動在您的 Makefile 中生成依賴項。所有方法看起來都很相似,我實現了這個

我能找到的所有 arguments 都符合以下內容:它可以幫助您,因為您不必手動管理依賴項。 我不明白為什么。

考慮以下文件:

主要.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.c除了文本編輯器之外不依賴於任何東西。 main.o依賴於main.cfoo.h ,因為編譯main.o需要這些文件。 你最終的二進制文件應該依賴於main.ofoo.o鏈接在一起,但需要明確說明 - make和 linker 都不會找出你想要一起構建的文件。

這種自動依賴性給你的是當foo.h改變時, main.o將需要重新編譯(因為它包含在main.c ),即使main.c本身沒有任何變化。

“我會說 main.c 取決於 foo。”

不完全的; main.o依賴於foo.h ,而app依賴於foo.o

自動依賴生成可以處理第一個依賴; 編譯器在main.c中找到#include "foo.h"並記下它。

您必須處理的第二個依賴項。 編譯器和 Make 都不能推斷出它。 (請記住,並非每個 header 文件都有一個具有匹配名稱的對應源文件。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM