[英]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.c
和foo.h
,因為編譯main.o
需要這些文件。 你最終的二進制文件應該依賴於main.o
和foo.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.