首先,讓我們先來簡單的了解一下什麼是makefile?
乙個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell指令碼一樣,其中也可以執行作業系統的命令。linux 環境下的程式設計師如果不會使用gnu make來構建和管理自己的工程,應該不能算是乙個合格的專業程式設計師。在 linux(unix )環境下使用gnu 的make工具能夠比較容易的構建乙個屬於你自己的工程,整個工程的編譯只需要乙個命令就可以完成編譯、連線以至於最後的執行。不過這需要我們投入一些時間去完成乙個或者多個稱之為makefile 檔案的編寫。所要完成的makefile 檔案描述了整個工程的編譯、連線等規則。其中包括:工程中的哪些原始檔需要編譯以及如何編譯、需要建立那些庫檔案以及如何建立這些庫檔案、如何最後產生我們想要的可執行檔案。
儘管看起來可能是很複雜的事情,但是為工程編寫makefile 的好處是能夠使用一行命令來完成「自動化編譯」,一旦提供乙個正確的makefile。編譯整個工程你所要做的唯一的一件事就是在shell 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。
現在我們來看乙個簡單的makefile:
lib_name=vendor1
//定義變數名
all:shared static
//make目標all 存在有shared static 兩個依賴
rm -f *.o //make目標all 下的動作
shared:
gcc -shared -fpic -o lib$.so *.c //目標shared下的動作
static:
gcc -c *.c
ar -rcs lib$.a *.o //目標static下的動作
clean:
rm -rf *.o
rm -rf *.a *.so
//目標clean下的動作
install:
cp lib$.* ~/dd //目標install下的動作
那麼makefile是怎麼執行make的呢?
一般來說,makefile下的第一條目標為總目標,輸入make時執行all目標,其目標下有shared和static依賴,那麼首先跳到shared下執行shared目標的動作(也就是命令),再回到all中 發現還存在依賴,就接著到static目標下執行動作,持續執行依賴,直到完成all目標下的依賴,在接著完成all目標下的動作。
ps:①動作可是linux下的命令,但是動作存在的一行的第乙個字元必須是tab鍵;
②目標下的依賴可以是檔案(目錄)或者是其他目標。
target: depend1 depend2 depend3 ...
[tab] action1
[tab ] action2
target1:
[tab] action1
[tab] action2
make後可以接目標作為命令:
關於make的一些選項:
make 找makefile或makefile檔案執行總的目標
make clean 執行makefile檔案中的clean目標
make -c directory 進入到directory資料夾中去執行總的目標
make clean -c direcotry 進入到directory資料夾中去執行clean目標
make -f comm_makefile 通過-f選項指定乙個makefile檔案
make var=value 給makefile傳乙個引數var,其值為value
關於makefile的解釋
makefile是一種配置檔案,makefile 乙個工程中的原始檔不計數,其按型別 功能 模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell指令碼一樣...
makefile學習筆記 makefile概述
20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...
關於makefile的那些事兒
最近越來越感覺到,在linux下面身為乙個程式設計師,不會makefile就不是乙個合格的程式設計師,所以今天我們介紹下常用的makefile編寫.了解知識 編譯 把高階語言書寫的 轉換為機器可識別的機器指令。編譯高階語言後生成的指令雖然可被機器識別,但是還不能被執行。編譯時,編譯器檢查高階語言的語...