makefile檔案中寫的是:工程編譯的規則以及編譯順序。
只需要每次執行make命令,make就會自動在當前目錄下搜尋makefile或makefile。
然後按照makefile中指定的規則編譯整個工程。
注意:如果檔案不修改,則不需要重新編譯!!!
例如://makefile
main:main.o
gcc main.o -o main
main.o:
gcc -c main.c
(從「main:」進入,先找到main.o執行gcc -c main.c,然後再回到main執行gcc main.o -o main)
makefile基本格式:
target ... : condition ...
command
......
顯示規則 :顯式規則說明了,如何生成乙個或多的的目標檔案。這是由 makefile 的書寫者明顯指出,要生成的檔案,檔案的依賴檔案,生成的命令。
隱晦規則:由於我們的 make 有自動推導的功能,所以隱晦的規則可以讓我們比較粗糙地簡略地書寫 makefile,這是由 make 所支援的。
變數定義:在 makefile 中我們要定義一系列的變數,變數一般都是字串,這個有點你 c 語言中的巨集,當 makefile 被執行時,其中的變數都會被擴充套件到相應的引用位置上。
檔案指示:makefile中的目標檔案編譯依賴其他的標頭檔案;或是依賴其他makefile
注釋:makefile 中只有行注釋,和 unix 的 shell 指令碼一樣,其注釋是用「#」字元,這個就像 c/c++中的「//」一樣。如果你要在你的 makefile 中使用「#」字元,可以用反斜框進行轉義,如:「\#」。
還值得一提的是,在 makefile 中的命令,必須要以[tab]鍵開始
讀入檔案中的主makefile
讀入被引入的其他makefile檔案
初始化檔案的變數
推倒隱晦規則,並分析檔案當中其他的規則
為所有的目標檔案建立依賴關係鏈
根據依賴關係,確定哪些目標要重新生成
執行生成命令
2.1.1 規則語法
語法有以下兩種
target ... : condition ...
command
......
或
target ... : condition ... ;command
command
......
target也就是乙個目標檔案,可以使object file,也可以是可執行檔案。還可以是乙個標籤,即偽目標
2.1.2 規則中的萬用字元
* 標識任意乙個或多個字元
? 表示任意乙個字元
~ 表示使用者的home目錄
輸入' \ '可在下一行繼續輸入
2.1.3 路徑搜尋
當makefile檔案中依賴的檔案有不在當前路徑下時則要標明檔案路徑。
所以要在makefile檔案中標明檔案的路徑,makefile中有乙個特殊的標量vpath或vpath就是完成這個功能的。
指定了路徑之後,如果有檔案在當前目錄沒有找到時,就會到vpath指定的路徑下去找。
vpath = ./src : ./sum : ./public : ...//大寫的vpath可以直接賦值要找的路徑,每個路徑之間用 : 號隔開
vpath sum.c ./sumvpath main.c ./public
vpath %.h ./public
vpath %.c ./max : ./sum : ./sub : ./public
//使用vpath可以對指定檔案或指定的類標明路徑
vpath %.c2.2.1 變數定義//清除符合%.c檔案的搜尋路徑
vpath
//清除所有設定的搜尋路徑
objs = sum.o sub.o max.o min.o main.o測試:objs2 = $(objs) program.o
//目標objs包含了sum.o ... main.o
//目標objs2包含了objs的所有內容以及 program.o
objs = main.o max.o min.o\好處:如果有新的 .o 檔案加入,我們只需簡單地修改一下 objects 變數就可以了。sub.o
objects = $(objs) + sum.o
path = ./main : ./max : ./min : ./sub : ./sum
edit: $(objects)
gcc -o edit $(objects)
# bash中執行make命令
$ make
edit main.o max.o min.o sub.o sum.o
2.2.2 目標變數
objects = main.o command.o display.o \gnu 的 make 很強大,它可以自動推導檔案以及檔案依賴關係後面的命令,於是我們就沒必要去在每乙個[.o]檔案後都寫上類似的命令,因為,我們的 make 會自動識別,並自己推導命令。insert.o search.o
edit : $(objects)
gcc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
clean :
rm edit $(objects)
//edit就是乙個目標變數,即最後生成的目標檔案或可執行檔名就是edit
只要 make 看到乙個[.o]檔案,它就會自動的把[.c]檔案加在依賴關係中,如果 make 找到乙個 whatever.o,那麼 whatever.c,就會是 whatever.o 的依賴檔案。並且 cc -c whatever.c 也會被推導出來,於是,我們的 makefile 再也不用寫得這麼複雜。我們的是新的 makefile 又出爐了。
objects = main.o command.o display.o \這種方法就是 make 的「隱晦規則」。上面檔案內容中,「.phony」表示,clean 是個偽目標檔案。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
.phony : clean
clean :
rm edit $(objects)
執行clean命令,所生成的檔案就會全部刪除。
每個 makefile 中都應該寫乙個清空目標檔案(.o 和執行檔案)的規則,這不僅便於重編譯,也很利於保持檔案的清潔。
例如:
clean:更為完全的做法是rm edit $(objects)
.phony : clean.phony 意思表示 clean 是乙個「偽目標」,。而在 rm 命令前面加了乙個小減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。當然,clean 的規則不要放在檔案的開頭,不然,這就會變成 make 的預設目標,clean :
-rm edit $(objects)
記住——clean從來都是放在檔案的最後
暫時就先整理了這麼多,初學者知識能力有限,還望大佬們指教,謝謝!
linux下的makefile程式設計
程式1 mytool1.c include mytool1.h include stdio.h void mytool1 print char print str 程式2 mytool1.h ifndef mytool 1 h define mytool 1 h void mytool1 print...
Linux下的MakeFile檔案
makefile是linux下的檔案管理工具,本質是檔案,載入執行需要make命令,make命令可以認為是執行shell指令碼檔案 我們建立乙個makefile檔案,注意,在linux中,m首字母大小寫不區分 呼叫vim makefile makefile內容是main的gcc的過程,要分步驟寫,和...
linux 下makefile的使用舉例
該程式在linux平台下用c語言實現 有兩個標頭檔案m1.h m2.h 對應的實現檔案m1.c m2.c 除錯檔案test.c 案例 如下 m1.h includevoid m1 print char str m2.h includevoid m2 print char str m1.c inclu...