Linux下Makefile的基礎知識

2021-08-28 22:16:09 字數 4451 閱讀 8146

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  ./sum

vpath  main.c  ./public

vpath  %.h  ./public

vpath  %.c  ./max : ./sum : ./sub : ./public

//使用vpath可以對指定檔案或指定的類標明路徑

vpath  %.c  

//清除符合%.c檔案的搜尋路徑

vpath

//清除所有設定的搜尋路徑

2.2.1 變數定義

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\

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

好處:如果有新的 .o 檔案加入,我們只需簡單地修改一下 objects 變數就可以了。

2.2.2 目標變數

objects = main.o  command.o  display.o \

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

gnu 的 make 很強大,它可以自動推導檔案以及檔案依賴關係後面的命令,於是我們就沒必要去在每乙個[.o]檔案後都寫上類似的命令,因為,我們的 make 會自動識別,並自己推導命令。

只要 make 看到乙個[.o]檔案,它就會自動的把[.c]檔案加在依賴關係中,如果 make 找到乙個 whatever.o,那麼 whatever.c,就會是 whatever.o 的依賴檔案。並且 cc -c whatever.c 也會被推導出來,於是,我們的 makefile 再也不用寫得這麼複雜。我們的是新的 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

.phony : clean

clean :

rm edit $(objects)

這種方法就是 make 的「隱晦規則」。上面檔案內容中,「.phony」表示,clean 是個偽目標檔案。

執行clean命令,所生成的檔案就會全部刪除。

每個 makefile 中都應該寫乙個清空目標檔案(.o 和執行檔案)的規則,這不僅便於重編譯,也很利於保持檔案的清潔。

例如:

clean:

rm edit $(objects)

更為完全的做法是

.phony : clean

clean :

-rm edit $(objects)

.phony 意思表示 clean 是乙個「偽目標」,。而在 rm 命令前面加了乙個小減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。當然,clean 的規則不要放在檔案的開頭,不然,這就會變成 make 的預設目標,

記住——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...