makefile語法 Makefile的語法

2021-10-17 10:32:49 字數 3088 閱讀 2891

假如乙個目標檔案所依賴的依賴檔案很多,我們豈不是要寫很多規則?這顯然不合乎常理。

我們可以使用萬用字元解決這些問題。我們對上節程式進行修改**如下:

test: a.o b.o

gcc -o test $^

%.o : %.c

gcc -c -o $@ $<

%.o:表示所用的.o檔案

%.c:表示所有的.c檔案

$@:表示目標

$^:表示所有依賴檔案

在該目錄下增加乙個c.c檔案,**如下:

#includevoid func_c()
在main函式中呼叫修改的makefile,修改後的**如下:

test: a.o b.o c.ogcc -o test $^%.o : %.cgcc -c -o $@ $<
執行:

make
結果:

gcc -c -o a.o a.cgcc -c -o b.o b.cgcc -c -o c.o c.cgcc -o test a.o b.o c.o
執行:

./test
結果:

1.我們若清除檔案,在makefile的結尾新增如下**即可:

clean:rm *.o test
1).執行make:生成第乙個可執行檔案。

2).執行make clean: 清除所有檔案,即執行:rm *.o test。

2.使用makefile

執行:make [目標]

也可以不跟目標名,若無目標預設第乙個目標。執行make的時候,會在makefile裡面找到第乙個目標然後執行下面的指令生成第乙個目標。當執行make clean的時候,會在makefile裡面找到clean這個目標,然後執行裡面的命令,這個寫法有些問題,原因是我們的目錄裡面沒有clean這個檔案,這個規則執行的條件成立,它就會執行下面的命令來刪除檔案。

如果:該目錄下面有名為clean檔案怎麼辦呢?

make: `clean' is upto date.
它根本沒有執行我們的刪除操作,為什麼?

我們之前說,乙個規則能夠執行的條件:

1).目標檔案不存在

2).依賴檔案比目標新。

現在我們的目錄裡面有名為「clean」的檔案,目標檔案是有的,並且沒有依賴檔案,沒有辦法判斷依賴檔案的時間。這種寫法會導致:有同名的」clean」檔案時,沒有辦法執行make clean操作。

解決辦法:把目標定義為假想目標,用關鍵字phony。

.phony: clean //把clean定義為假想目標。它便不會判斷名為「clean」的檔案是否存在, 然後在makfile結尾新增.phony: clean語句,重新執行:make clean,就會執行刪除操作。

在makefile中有兩種變數:

· 1)簡單變數(即時變數):

a := *** // a的值即可確定,在定義時即確定

對於即時變數使用「:=」表示,它的值在定義的時候已被確定。

· 2)延時變數

b = *** // b的值被使用到時才確定

對於延時變數使用「=」表示。它只有在使用到的時候才確定,在定義/等於時並沒有確定下來。

想使用變數的時候使用「$」來引用,如果不想看到命令時,可以在命令的前面加上」@」符號,則不會顯示命令本身。

當我們執行make命令的時候,make這個指令本身,會把整個makefile讀進去,進行全部分析,然後解析裡面的變數。常用的變數的定義如下:

:= // 即時變數

= // 延時變數

?= // 延時變數, 如果是第一次定義才起效, 如果在前面該變數已定義則忽略這句

+= // 附加, 它是即時變數還是延時變數取決於前面的定義

?=: // 如果這個變數在前面已經被定義,這句話就不會起效果。

例項:

a := $(c)b = $(c)c = abc#d = 100askd ?= weidongshanall:@echo a = $(a)@echo b = $(b)@echo d = $(d)c += 123
執行:

make
結果:

a =b = abc 123d = weidongshan
分析:

1)a := $(c):a為即時變數,在定義時即確定,由於剛開始c的值為空,所以a的值也為空。

2) b = (c):b為延時變數,只有使用到時它的值才確定,當執行make時,會解析makefile裡面的所用變數,所以先解析c=abc, 然後解析c+=123,此時c=abc123,

當執行:@echob=(c):b為延時變數,只有使用到時它的值才確定,當執行make時,會解析makefile裡面的所用變數,所以先解析c=abc, 然後解析c+=123,此時,c=abc123,當執行:@echob=(b) b的值為 abc 123。

3)d ?= weidongshan:d變數在前面沒有定義,所以d的值為weidongshan,如果在前面新增d = 100ask,最後d的值為100ask。

我們還可以通過命令列存入變數的值

例如執行:

make d=123456
裡面的d ?= weidongshan這句話便不再起作用。

結果:

a =b = abc 123d = 123456

makefile語法示例

edit main.o kbd.o cc o edit main.o kdb.o main.o main.c defs.h cc c main.c kbd.o kbd.c defs.h command.h cc c kbd.c clean rm o edit makefile中使用變數 object...

Makefile編寫語法

makefile樣例 all main.c foo1.c foo2.c foo3.c gcc main.c foo1.c foo2.c foo3.c o all targets prerequisites command 或者targets prerequisites command targets...

makefile語法基礎。

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