對於含有多個源文件的程序的編譯鏈接,使用make工具可以更方便。
這些源文件的處理步驟通常記錄在一個叫makefile的文件里。這個makefile文件和源代碼放在同一個目錄下。在這個目錄下運行make命令時,按照GNUmakefile、makefile、Makefile的順序找到第一個存在的文件並執行(有些Unix系統的make命令不是GNU make,不會查找GUNmakefile這個文件名),完成相應的編譯步驟。
makefile由一組規則(Rule)組成,一般規則的格式如下:
例如:
main是這條規則的目標(target),main.o,f1.o,f2.o,f3.o是這條規則的條件,gcc main.o f1.o f2.o f3.o -o main是這條規則的命令;makefile文件就是由一條條這樣的規則組成。命令列表中的每條命令必須以一個Tab開頭,注意不能是空格,makefile的格式不像C語言的縮進那么隨意,make會創建一個shell進程去執行每條命令。目標和條件之間的關系是:要更新目標,必須更新該目標對應的條件;更新指的是:執行這條規則的命令列表。
運行make命令時,要是make后面帶了參數(一個目標),則執行這個目標對應的規則,否則,執行缺省目標對應的規則。makefile中第一條規則的目標就是缺省目標,只要缺省目標更新了,就算完成任務了,其他的更新都是為了更新缺省目標。
下面是一個完整的makefile文件:
總結一下makefile的規則:
如果一條規則的目標屬於如下情況,則目標需要更新:
1.目標沒有生成;
2.某個條件需要更新;
3.某個條件的修改時間比目標晚。
一條規則執行前,規則的條件屬於如下狀態之一:
1.需要更新:能找到以這個條件為目標的規則,並且在這個規則中,目標是需要更新的。
2.不需要更新:能找到以這個條件為目標的規則,但在這個規則中,目標不需要更新;不能找到以這個條件為目標的規則,並且該條件已經生成。
3.錯誤:不能夠找到以這個條件為目標的規則,並且這個條件沒生成。
執行一條規則(A)的步驟如下:
1.檢查它的每個條件P:
(1)如果P需要更新,就執行以P為目標的規則B。之后,無論是否生成文件P,都認為p已經被更新;
(2)如果找不到規則B,並且文件P已存在,表示P不需要更新。
(3)如果找不到規則B,並且文件p不存在,則報錯退出。
2.檢查它的目標(T),如果屬於以下情況之一,則執行它的命令列表:
(1)文件T不存在。
(2)文件T存在,但是某個條件的修改時間比它晚。
(3)某個條件p已被更新(並不一定生成文件p)。
通常makefile都會有一個clean規則,用於清除編譯過程中產生的二進制文件,保留源文件。