1.gnu make是乙個命令工具,是乙個用來控制軟體構建過程的自動化管理工具。make工具通過稱為makefile的檔案完成並自動維護編譯工作。
3、makefile定義了一系列的規則來指定,乙個工程中的哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作。
總之,makefile為我們帶來了極大地好處—–「自動化編譯」,一旦編譯成功,只要我們使用乙個make工具,整個工程就完全自動化編譯,為軟體開發提高了效率。
1、基本構成
目標檔案列表 分隔符 依賴檔案列表[命令]
[命令]
2、makefile的組成部分
乙個完整的makefile檔案主要有以下及部分構成:
(1)顯式規則
所謂顯式規則就是顯式指定依賴檔案或命令,例如:
test:test.c
gcc -o test test.c
當我們想生成乙個可執行檔案test時,這個test檔案依賴與test.c檔案,就可以用上面的格式進行編寫,切記要在命令列前面加上tab鍵(2)隱含規則
所謂隱含規則就是需要自動推導檔案以及依賴檔案後面的命令,不需要我們把每乙個檔案都寫全,只要make看到乙個[.o]檔案,它就會自動的把[.c]檔案加在依賴關係中,如果make找到一 個whatever.o,那麼whatever.c,就會是whatever.o的依賴檔案。並且 cc -c whatever.c 也會被推導出來,於是,我們的makefile再也不用寫得這麼複雜。
乙個例子來幫助我們理解一下:
objects = main.o command.o display.o /
insert.o search.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
clean :
rm edit $(objects)
這裡有很多[.o]檔案的依賴關係,看起來**很複雜,很多,那麼我們就可以使用隱含規則的推導功能重新寫這個makefile:
objects = main.o command.o display.o /
insert.o search.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
command.o : command.h
display.o insert.o search.o : buffer.h
clean :
rm edit $(objects)
這樣看起來就簡單很多,但是也有缺點,這樣修改會破壞檔案本身的依賴關係
(3)偽目標
它不代表乙個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們也可以將乙個偽目標稱為標籤。使用偽目標有兩點原因:
1. 避免在我們的makefile中定義的只執行命令的目標(此目標的目的為了執行一系列命令,而不需要建立這個目標)和工作目錄下的實際檔案出現名字衝突。
2. 提高執行make時的效率,特別是對於乙個大型的工程來說,編譯的效率也許你同樣關心。
例如:
clean:
rm -f .o temp
這裡的「rm」並不是建立「clean」檔案,而是刪除當前目錄下的所有.o和temp檔案,但是當當前目錄下沒有clean檔案時,當我們輸入「make clean」時,rm這一行命令總會被執行,但是當存在clean檔案時,在我們輸入「make clean」時。規則沒有依賴檔案,所以目標被認為是最新的而不去執行規則作定義的命令,命令「rm」將不會被執行。
但這並不是我們期望的結果,所以這時候就可以將clean檔案定義成偽目標,就不會存在這種情況了;
.phony : clean
這樣,不管是否存在clean檔案,我們輸入「make clean」之後。「rm」命令都會被執行。
(3)特殊目標
(4)使用變數
如何編寫寫簡單的Makefile
在linux系統中,當需要編譯多個.c檔案時,如果我們乙個乙個去編譯原始檔,會變得十分麻煩,所以我們通常我編寫乙個makefile檔案,這個檔案相當於乙個指令碼檔案,當完成makefile檔案的編寫後,只需要通過make命令就可以完成原始檔的預編譯,編譯,彙編,鏈結過程,生成可執行檔案。target...
簡單編寫makefile
乙個makefile基本的規則 a b tab tab a為目標檔案,b為依賴檔案 可能含有多個 接下來為命令 必須含有tab 操作依賴檔案得到目標檔案 以乙個簡單的示例來演示如何編寫乙個基礎的makefile ifndef file1 h define file1 h ifdef cplusplu...
編寫簡單的makefile
假如有乙個上百個檔案的 構成的專案,如果只是對其中乙個或少數幾個檔案進行了修改,若用gcc編譯工具就不得不把整個專案裡的檔案重新編譯一遍。編譯過程分為編譯 彙編鏈結等階段。其中,編譯階段僅檢查語法錯誤以及函式與變數的宣告是否正確,在鏈結階段則主要完成函式鏈結和全域性變數的鏈結。因此,沒有改動的源 根...