在linux系統中我們通常使用gcc等命令來實現乙個專案的流程,而makefile類似於乙個shell指令碼,通過一系列規則來幫助我們簡化專案的編譯、鏈結等操作。可以實現近乎windows上vc++等編譯器的功能。
我們可以像在終端中輸入命令一樣,將命令寫在makefile中。依靠簡單的依賴原則,makefile會比較檔案最後的修改時間來決定是否執行該命令,即
工作原理(更新機制):如果被依賴項的更新時間比依賴項新,則會更新被依賴項。
例如:
#注意,必須要有縮排
main.o:main.c
gcc main.c -o main.o
例如:
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
類似shell指令碼語句,makefile中設定變數直接通過等號「=」賦值:
obj=main.o add.o sub.o
在makefile中可以通過一些匹配符來代替字串,簡化編寫:
公式匹配:
%:匹配符號,根據格式進行匹配,同一行%表示相同的字段
%.o:%.c
#用來代替main.o:main.c
只能在規則中的命令中使用:$
$@:規則中的目標
$^:規則中所有的依賴
%.o:%.c
gcc $< -c $@
# $《代替main.c,$@代替main.o
makefile中維護的變數:
都是大寫
cc:cc = cc
cppflags:cppflags = -i;預編譯需要的變數
makefile中也定義了自己的函式,來方便我們進行編寫,簡單舉兩個最常用的函式
wildcard:查詢某種型別的檔案,$是取出返回值
src=$(wildcard ./*.c)
#wildcard是函式名,無需括號
#./*.c,是當前目錄下所有.c檔案,是wildcard的輸入引數
#$,是取值,()通過括號將值返回
patsubst:字串匹配替換函式,第乙個引數是替換後的值,第二個引數是替換前的值,第三個引數是需要替換的字串
obj=$(patsubst ./%.c,./%.o,$(src))
#patsubst,是函式名
#後面三個是patsubst的輸入引數,即將src中的字串值取出來,將所有的.c替換成.o
直接make是生成終極目標make clean不會在資料夾生成clean,如果clean沒有依賴,預設接下來的命令是生成目標
.phony:clean
clean:
rm $(obj) $(target) -f
#-f是強制執行,不管有沒有都強行執行命令
#需要.phony:clean宣告clean使其不會比較更新時間,如果本地磁碟有clean也不會造成影響。
開發記錄 Makefile快速入門
這裡簡單說一下makefile的寫法,主要是個人的喜歡寫法,複雜的語法部門沒有加入,只是一些簡單的入門,同時也是我經常使用的。在makefile中也是有一些我們常用的函式的,簡單的比如 主要功能就是增加字首,用法如下 addprefix prefix,names.例子 addprefix src f...
Linux下Makefile快速編寫入門
一 為什麼要編寫makefile 我們自己平常在linux下編譯原始檔時,當然可以使用gcc wall g main.c o main這樣的命令乙個乙個編譯,但是乙個工程中的原始檔不計其數,其按型別 功能 模組分別放在若干個目錄中,我們乙個個編譯是極其花費時間的,也是不可取的。makefile帶來的...
Linux下Makefile快速編寫入門
一 為什麼要編寫makefile 我們自己平常在linux下編譯原始檔時,當然可以使用gcc wall g main.c o main這樣的命令乙個乙個編譯,但是乙個工程中的原始檔不計其數,其按型別 功能 模組分別放在若干個目錄中,我們乙個個編譯是極其花費時間的,也是不可取的。makefile帶來的...