Makefile知識小記

2021-08-28 11:10:43 字數 2092 閱讀 9483

gcc是linux中的編譯器,它是通過某種規則來進行編譯的,在這之前還有乙個linux自帶的構建器叫make,make也需要通過某種規則來構建,而這些規則就通過makefile來設定。

makefile檔案的命名可以是makefile或makefile。

makefile中的規則

三部分:目標、依賴、命令

目標:依賴

(tab縮排)命令

makefile中由一條或多條規則組成。

makefile的工作原理

第一行的目標是做為這個makefile要生成的最總目標,會依次檢測依賴是否存在,當依賴不存在,會向下搜尋下邊的規則,如果有規則是用來生成查詢的依賴的,執行規則中的命令;如果依賴存在,則會判斷是否需要更新該依賴,因為目標的生成時間應該要比依賴的時間要晚才對。例如:

a.o:a.c

gcc a.c -c

b.o:b.c

gcc b.c -c

c.o:c.c

gcc c.c -c

makefile中的變數

以上的makefile的編寫顯得冗餘,可以用變數來改善:

makefile自帶的變數(都是大寫)

cppflags、cc等,這些變數有些已經被賦值,但還是可以用來賦值

自動變數

$@ : 規則中的目標

$< : 規則中的第乙個依賴

$^ : 規則中所有的依賴

自動變數只能在規則中的命令中使用

修改上面的makefile

obj = a.o b.o c.o					# makefile中的注釋用#號

$(target) : $(obj)

gcc $(obj) -o $(target) # gcc %^ -o $@

%.o : %.c

gcc -c $< -o $@

其中obj和target是自定義變數,值分別為三個.o檔案和要生成的目標檔案,「$」符號表示去取變數的值;「%」是乙個萬用字元,做模式匹配用,例如在第一次查詢依賴a.o時,發現沒有,向下查詢規則,%被替換成a,第二次查詢b.o又被替換成b。

makefile中的函式

為了使makefile在移植性方面做得更好,可以使用函式來改善,這是因為makefile中的所有函式都是有返回值的。

查詢指定目錄下指定型別的檔案:

src = $(wildcard ./*.c) #當前目錄下的所有.c檔案返回到src中。
匹配替換:

obj = $(patsubst %.c,%.o,$(src))				#將src中的.c替換成.o
再修改上面的makefile

src = $(wildcard ./&.c)

obj = $(patsubst %.c,%.o,$(src))

$(target) : $(obj)

gcc $(obj) -o $(target) # gcc %^ -o $@

%.o : %.c

gcc -c $< -o $@

清理專案

可以在makefile中新增清理專案的規則:

.phony clean

clean:

rm *.o $(target) -f #加上-f表示強制刪除

宣告偽目標

偽目標的用處在於不想讓make對目標做判斷是否是最新的,例如在資料夾下有檔名為clean,但makefile中有clean規則,執行make clean時就會收到clean的影響,將clean宣告為偽目標可以避免這種影響,方法是在clean規則上加上:

.phony clean

makefile學習小記(一)

makefile一直沒有仔細的去看看,最近下狠心看了看,有一些收穫 先來看看這個例子 main.c include dep.h void main dep.c include dep.h void dep int i dep.h include void dep int i 再來看看makefile...

Makefile 入門知識

這篇文章介紹在linux下進行c語言程式設計所需要的基礎知識。在這篇文章當中,我們將會學到以下內容 源程式編譯 makefile的編寫 程式庫的鏈結 程式的除錯 標頭檔案和系統求助 1.源程式的編譯 在linux下面,如果要編譯乙個c語言源程式,我們要使用gnu的gcc編譯器。下面我們以乙個例項來說...

Makefile知識要點

clean rm o phony clean phony顯式地告訴 make clean的是偽目標,那麼每次makeclean必然會執行rm o。否則存在一種可能性,假如當前路徑下有乙個名為clean的檔案,因為clean這個目標又沒有依賴的檔案,那這個clean檔案永遠被認為是最新的,導致rm指令...