Makefile基礎語法入門

2021-09-29 15:28:41 字數 2919 閱讀 7012

makefile 是一種常用於編譯的指令碼語言。它可以更好更方便的管理你的專案的**編譯,節約編譯時間(沒改動的檔案不編譯)。

注意 makefile 檔案命令必須是 makefile 或者 makefile,並使用 make 命令編譯。

目標...: 依賴...

命令1命令2

...

目標即要生成的檔案。如果目標檔案的更新時間晚於依賴檔案的更新時間,則說明依賴檔案沒有改動,目標檔案不需要重新編譯。否則重新編譯並更新目標。

即目標檔案由哪些檔案生成。如果依賴條件中存在不存在的依賴條件,則會尋找其它規則是否可以產生依賴條件。

例如:規則一是生成目標 hello.out 需要使用到依賴條件 hello.o,但是 hello.o 不存在。則 makefile 會尋找到乙個生成 hello.o 的規則二並執行。

即通過執行該命令,由依賴檔案生成目標檔案。

注意每條命令前必須有且僅有乙個 tab 保持縮排,這是語法要求。

makefile 檔案預設只生成第乙個目標檔案即完成編譯,但是我們可以通過 「all」 指定需要生成的目標檔案。

#include int main()

然後寫乙個 makefile

all: hello.out

hello.out: hello.c

gcc hello.c -o hello.out

編譯並執行:

$ make

gcc hello.c -o hello.out

$ ./hello.out

hello world !

例如

src = $(wildcard ./*.c)
匹配目錄下所有的 .c 檔案,並將其賦值給 src 變數。

pat 是 pattern 的縮寫,subst 是 substring 的縮寫。例如

obj = $(patsubst %.c, %.o, $(src))
這個函式有三個引數,意思是取出 src 中所有的值,然後將 「.c」 替換為 「.o」,最後賦值給 obj 變數。

通過上面兩個函式,加入我們目錄下有很多個 「.c」 字尾的原始檔,就不需要寫很多條規則語句了,而是可以像下面這樣寫

src = $(wildcard *.c)

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

all: hello.out

hello.out: $(obj)

gcc $(obj) -o hello.out

$(obj): $(src)

gcc -c $(src) -o $(obj)

這裡我們先將所有的 「.c」 檔案編譯為 「.o」 檔案,這樣後面更改某個 「.c」 檔案時,其它的 「.c」 檔案將不再編譯,而只是編譯有更改的 「.c」 檔案,可以大大節約大專案中的編譯速度。

makefile 中也有一些已經定義好的常用變數,這裡介紹其中常用的3個。

表示規則中目標,例如 hello.out。

表示規則中的第乙個依賴條件,例如 hello.c

表示規則中的所有依賴條件,由於我們示例中都只有乙個依賴條件,這種情況下 $^ 和 $< 區別不大。

使用這些變數替換上面寫的 makefile,即是:

src = $(wildcard *.c)

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

all: hello.out

hello.out: $(obj)

gcc $< -o $@

$(obj): $(src)

gcc -c $< -o $@

我們可以編譯一條屬於自己的 clean 語句,來清理 make 命令所產生的所有檔案。例如

src = $(wildcard *.c)

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

all: hello.out

hello.out: $(obj)

gcc $< -o $@

$(obj): $(src)

gcc -c $< -o $@

clean:

-rm -rf $(obj) hello.out

這樣我們就可以使用 clean 命令來清理生成的檔案了:

$ ls

hello.c  hello.o  hello.out  makefile

$ make clean

rm -rf  hello.o hello.out

$ ls

hello.c  makefile

上面我們寫了乙個 clean 語句,使得我們執行 「make clean」 命令的時候,可以清理我們生成的檔案。

但是假如還存在乙個檔名就是 clean 檔案,那麼我們再執行 「make clean」 命令的時候就只是顯示

$ make clean

make: `clean' is up to date.

解決方法就是我們使用偽目標,這樣就可以避免出現上面的問題了,例如:

src = $(wildcard *.c)

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

all: hello.out

hello.out: $(obj)

gcc $< -o $@

$(obj): $(src)

gcc -c $< -o $@

clean:

-rm -rf $(obj) hello.out

.phony: clean all

通常,我們也會把 all 也設定為偽目標。 

makefile語法基礎。

cross compile arm linux gnueabihf target bsp cc cross compile gcc 變數名 引用變數 ld cross compile ld objcopy cross compile objcopy objdump cross compile obj...

Makefile 入門與基本語法

在我看來,學會寫簡單的makefile,閱讀較複雜的makefile,是每乙個linux程式設計師都必須擁有的基本素質。makefile可以自動識別哪些原始檔被更改過,需要重新編譯,那些不需要。從而節省大型工程重新編譯的時間。規則如下 如果這個工程沒有編譯過,那麼我們的所有c檔案都要編譯並被鏈結。如...

makefile語法 Makefile的語法

假如乙個目標檔案所依賴的依賴檔案很多,我們豈不是要寫很多規則?這顯然不合乎常理。我們可以使用萬用字元解決這些問題。我們對上節程式進行修改 如下 test a.o b.o gcc o test o c gcc c o o 表示所用的.o檔案 c 表示所有的.c檔案 表示目標 表示所有依賴檔案 在該目錄...