基本的 Makefile

考慮寫一個 Hello World! 程式在 c。讓我們說我們的原始碼在一個名為 source.c 的檔案中,現在為了執行我們需要編譯它的程式,通常在 Linux 上(使用 gcc)我們需要輸入 $> gcc source.c -o output,其中 output 是可執行檔案的名稱產生。對於基本程式,這很有效,但隨著程式變得越來越複雜,我們的編譯命令也會變得更加複雜。這是 Makefile 的用武之地,makefile 允許我們為編譯程式編寫一組相當複雜的規則,然後通過在命令列輸入 make 來編譯它。例如,這裡是上面的 hello wold 示例的可能示例 Makefile。

基本的 Makefile

讓我們建立一個基本的 Makefile ,並將它儲存到我們的系統中,與我們的原始碼 Makefile 相同。請注意,此檔案需要命名為 Makefile,但是 capitol M 是可選的。這說使用國會大廈 M 是相對標準的。

output: source.c
    gcc source.c -o output

請注意,在第二行的 gcc 命令之前只有一個選項卡(這在 makefile 中很重要)。一旦每次使用者輸入 make(與 Makefile 在同一目錄中)時都會寫入這個 Makefile,make 將檢查 source.c 是否已被修改(檢查時間戳),如果它已被修改,而不是輸出它將執行以下行的編譯規則。

Makefile 中的變數

根據專案的不同,你可能需要在 make 檔案中引入一些變數。這是一個包含變數的 Makefile 示例。

CFLAGS = -g -Wall

output: source.c
    gcc $< $(CFLAGS) -o $@

現在讓我們來探討這裡發生的事在第一行中,我們宣告瞭一個名為 CFLAGS 的變數,該變數包含你可能希望傳遞給編譯器的幾個常見標誌,請注意你可以在此變數中儲存任意數量的標誌。然後我們使用與之前相同的行來告訴 make 檢查 source.c 以檢視它是否比輸出更新,如果是,它執行編譯規則。我們的編譯規則與以前大致相同,但是通過使用變數縮短了它,$< 變數內建於 make 中(稱為自動變數,請參閱 https://www.gnu.org/software/make/manual/html_node /Automatic-Variables.html )它總是代表源,所以在這種情況下 source.c$(CFLAGS) 是我們之前定義的變數,但請注意,我們必須將變數放在括號中,並且前面有一個$,如 this$(someVariable)。這是告訴 Make 將變數擴充套件為你之前鍵入的語法的語法。最後我們有$ @符號,這又是一個內建於 make 的變數,它只是代表編譯步驟的目標,所以在這種情況下它代表輸出

清潔

Make clean 是瞭解 make 檔案的另一個有用概念。讓我們從上面修改 Makefile

CFLAGS = -g -Wall
TARGETS = output

output: source.c
    gcc $< $(CFLAGS) -o $@

clean:
    rm $(TARGETS)

正如你所看到的,我們只是在 Makefile 中新增了一個規則,以及一個包含所有目標的附加變數。這是一個在 makefile 中有一些常見的規則,因為它允許你通過輸入 $> make clean 快速刪除你生成的所有二進位制檔案。通過鍵入 make clean,你可以告訴 make 程式執行 clean 規則,然後 make 將執行 rm 命令來刪除所有目標。

我希望這個使用 make 的簡要概述可以幫助你加快工作流程, Makefile 可能會變得非常複雜,但是有了這些想法,你應該能夠開始使用 make 並更好地瞭解其他程式設計師 Makefiles 正在發生的事情。有關使用 make 一個優秀資源的更多資訊,請訪問 https://www.gnu.org/software/make/manual/