Makefile介紹及Makefile是如何工作的

2021-07-31 05:53:40 字數 1436 閱讀 5077

make命令執行時,需要乙個 makefile 檔案,以告訴make命令如何去編譯和鏈結程式。

首先,我們用乙個示例來說明makefile的書寫規則。以便給大家乙個感性認識。這個示例**於gnu的make使用手冊,在這個示例中,我們的工程有8個c檔案,和3個頭檔案,我們要寫乙個makefile來告訴make命令如何編譯和鏈結這幾個檔案。我們的規則是:

1)如果這個工程沒有編譯過,那麼我們的所有c檔案都要編譯並被鏈結。

2)如果這個工程的某幾個c檔案被修改,那麼我們只編譯被修改的c檔案,並鏈結目標程式。

3)如果這個工程的標頭檔案被改變了,那麼我們需要編譯引用了這幾個標頭檔案的c檔案,並鏈結目標程式。

只要我們的makefile寫得夠好,所有的這一切,我們只用乙個make命令就可以完成,make命令會自動智慧型地根據當前的檔案修改的情況來確定哪些檔案需要重編譯,從而自己編譯所需要的檔案和鏈結目標程式。

在預設的方式下,也就是我們只輸入make命令。那麼,

1.make會在當前目錄下找名字叫「makefile」或「makefile」的檔案。

2.如果找到,它會找檔案中的第乙個目標檔案(target),在上面的例子中,他會找到「edit」這個檔案,並把這個檔案作為最終的目標檔案。

3.如果edit檔案不存在,或是edit所依賴的後面的 .o 檔案的檔案修改時間要比edit這個檔案新,那麼,他就會執行後面所定義的命令來生成edit這個檔案。

4.如果edit所依賴的.o檔案也不存在,那麼make會在當前檔案中找目標為.o檔案的依賴性,如果找到則再根據那乙個規則生成.o檔案。(這有點像乙個堆疊的過程)

5.當然,你的c檔案和h檔案是存在的啦,於是make會生成 .o 檔案,然後再用 .o 檔案生成make的終極任務,也就是執行檔案edit了。

這就是整個make的依賴性,make會一層又一層地去找檔案的依賴關係,直到最終編譯出第乙個目標檔案。在找尋的過程中,如果出現錯誤,比如最後被依賴的檔案找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管檔案的依賴性,即,如果在我找了依賴關係之後,冒號後面的檔案還是不在,那麼對不起,我就不工作啦。

通過上述分析,我們知道,像clean這種,沒有被第乙個目標檔案直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,我們可以顯式要make執行。即命令——「make clean」,以此來清除所有的目標檔案,以便重編譯。

於是在我們程式設計中,如果這個工程已被編譯過了,當我們修改了其中乙個原始檔,比如file.c,那麼根據我們的依賴性,我們的目標file.o會被重編譯(也就是在這個依性關係後面所定義的命令),於是file.o的檔案也是最新的啦,於是file.o的檔案修改時間要比edit要新,所以 edit也會被重新鏈結了(詳見edit目標檔案後定義的命令)。

而如果我們改變了「command.h」,那麼,kdb.o、command.o和files.o都會被重編譯,並且,edit會被重鏈結。

C語言make和Makefile介紹及使用

在軟體的工程中的原始檔是不計其數的,其按照型別,功能,模組分別放在若干個目錄中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行 更複雜的功能操作,這就引入了我們的系統編譯的工具 在linux和unix中,有乙個強大的使用程式,叫make,可以用它來管理多模組程式的編譯和鏈結,直...

Make選項及makefile常用變數

make命令可以帶幾種引數 標誌,巨集定義,描述檔名和目標檔名,標準形式為 make flags macro definitions targets 在unix下,flags包含 f file 指定file檔案為描述檔案.如果file引數為 描述檔案指向標準輸入,如果沒有 f 則系統預設當前目錄下m...

makefile介紹及示例

乙個開發工程會有很多的原始檔,它們按型別 功能 模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯等。makefile檔案關係到整個工程的編譯規則。寫好的makefile,只要執行make命令,就會按makefile裡定義...