1. 程式人生 > >Linux下makefile學習

Linux下makefile學習

文本文 新規 兩個 組成 https 當前 自動更新 mman n)

[make是什麽?]

  make是一個命令工具,是一個解釋makefile中指令的命令工具。它可以簡化編譯過程裏面所下達的指令,當執行 make 時,make 會在當前的目錄下搜尋 Makefile (or makefile) 這個文本文件,執行對應的操作。make 會自動的判別原始碼是否經過變動了,而自動更新執行檔。

[為什麽要使用make?]

  假設,現在一個項目裏面包含了100個程序文件,如果要對這個項目進行編譯,那麽光是編譯指令就有100條。如果要重新進行編譯,那麽就又得像之前一樣重新來一遍。這樣重復且繁瑣的工作實在是讓我們很不爽啊。所以,用make來進行操作,間接調用gcc豈不是很方便?如果我們更動過某些原始碼檔案,則 make 也可以主動的判斷哪一個原始碼與相關的目標文件檔案有更新過, 並僅更新該檔案。這樣可以減少重新編譯所需要的時間,也會更加方便。

[makefile又是幹什麽的?]

  makefile其實就是一個文檔,裏面定義了一系列的規則指定哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,它記錄了原始碼如何編譯的詳細信息! makefile一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。

[定義]

Makefile文件由一系列規則(rules)構成。每條規則的形式如下。

<target> : <prerequisites>
[tab] <commands>

上面第一行冒號前面的部分,叫做"目標"(target),冒號後面的部分叫做"前置條件"(prerequisites);第二行必須由一個tab鍵起首,後面跟著"命令"(commands)。

目標:

一個目標就構成一條規則。目標通常是文件名,指明make命令要構建的對象,目標可以是一個文件名,也可以是多個文件名。之間用空格分隔。

除了文件名,目標還可以是某個操作的名字(如:clean),這稱為是“偽目標”(phony target)

前置條件:

前置條件通常是一組文件名,之間用空格分隔。它指定了"目標"是否重新構建的判斷標準:只要有一個前置文件不存在,或者有過更新(前置文件的last-modification時間戳比目標的時間戳新),"目標"就需要重新構建。

命令:

命令(commands)表示如何更新目標文件,由一行或多行的Shell命令組成。它是構建"目標"的具體指令,它的運行結果通常就是生成目標文件。

當你寫下一個規則的時候,例如:

unit: output.o test2.o
    gcc -o unit output.o test2.o

就是說,讓編譯器以(output.o test2.o)為前置條件,使用gcc編譯器對這兩個目標文件進行鏈接生成 unit 可執行文件 ,

但是如果(output.o test2.o)這兩個文件中有一個不存在,我們可以在makefile文件中再添加兩條規則來生成這個文件.

output.o:test2.h output.c
    gcc -c output.c

test2.o:test2.h test2.c
    gcc -c test2.c

對於兩個源文件一個頭文件,使用一個完整的makefile文件規定他們之間的編譯規則:

unit: output.o test2.o
    gcc -o unit output.o test2.o

output.o:test2.h output.c
    gcc -c output.c

test2.o:test2.h test2.c
    gcc -c test2.c

#刪除所有目標文件,並聲明clean為偽目標
.PHONY:clean
clean:
    rm *.o

執行結果:

技術分享圖片

Make 處理makefile文件的過程了解一下?

缺省情況下,make開始於第一個目標,這個目標稱為缺省最終目標.如上面的makefile文件中的 unit .

這樣,當我們在終端敲下 make 命令的時候,Make 就會讀取當前目錄下的makefile文件,並開始處理第一條規則,本例中就是鏈接生成unit可執行文件,

但在make全部完成本規則工作之前,必須先處理 unit 所依靠的OBJ文件,這些OBJ文件被按照自己的規則處理更新,每個OBJ文件的更新規則是編譯其源文件.如果源文件都沒有改變,則不進行重新編譯.

其他規則的處理根據他們的目標和缺省最終目標的依賴關系來判斷,如果沒有任何關聯,則不會被執行.除非告訴make強制執行.如:[make clean]

在OBJ文件被重新編譯(如果需要的話)之後,make決定是否重新鏈接生成unit的可執行文件.任何文件有改變的話,則對有依賴的文件進行編譯,並生成新的可執行文件.

參考資料:

https://www.cnblogs.com/qiaopei/p/5550168.html

Linux下makefile學習