快速入門makefile

2021-10-19 08:50:14 字數 1713 閱讀 1404

​ 在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帶來的...