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指令...