makefile教程(基礎) part1

2021-09-18 02:14:12 字數 2624 閱讀 1815

target... : prerequisites ...

command

......

解釋:

target : 是乙個目標檔案,也可以是執行檔案,還可以是乙個標籤(label)。

prerequisites :要生成那個target所需要的檔案或是目標。

command : make需要執行的命令。(任意的shell命令)

main : main.o run.o speak.o eat.o sleep.o

gcc -o main main.o run.o \

speak.o eat.o sleep.o

main.o: main.c

gcc -c main.c

run.o : run.c run.h

gcc -c run.c run.h

sleep.o : sleep.h sleep.c

gcc -c sleep.h sleep.c

eat.o : eat.h eat.c

gcc -c eat.c eat.h

speak.o : speak.h speak.c

gcc -c speak.h speak.c

clean :

-rm main.o run.o \

speak.o eat.o sleep.o main

反斜槓(\)是換行符的意思。這樣比較便於makefile的易讀。

一、在定義依賴關係後,後續的那一行定義了如何生成目標檔案的作業系統命令,一定要以乙個tab鍵作為開頭。

二、make會比較targets檔案和prerequisites檔案的修改日期,如果prerequisites檔案的日期要比targets檔案的日期要新,或者target不存在的話,那麼,make就會執行後續定義的命令。

三、clean不是乙個檔案,它只不過是乙個動作名字,有點像c語言中的lable一樣,其冒號後什麼也沒有,那麼,make就不會自動去找檔案的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令,就要在make命令後明顯得指出這個lable的名字。這樣的方法非常有用,我們可以在乙個makefile中定義不用的編譯或是和編譯無關的命令,比如程式的打包,程式的備份,等等。

對於.o檔案多次被使用,在makefile中以「$(objects)」的方式來使用這些變數

objects= main.o run.o \

speak.o eat.o sleep.o

main : $(objects)

gcc $(cflags) -o main $(objects)

main.o: main.c

gcc $(cflags) -c main.c

run.o : run.h run.c

gcc $(cflags) -c run.h run.c

sleep.o : sleep.h sleep.c

gcc $(cflags) -c sleep.h sleep.c

eat.o : eat.h eat.c

gcc $(cflags) -c eat.h eat.c

speak.o : speak.h speak.c

gcc $(cflags) -c speak.h speak.c

clean :

-rm $(objects) main

gnu的make很強大,它可以自動推導檔案以及檔案依賴關係後面的命令,於是我們就沒必要去在每乙個[.o]檔案後都寫上類似的命令,因為,我們的make會自動識別,並自己推導命令。

只要make看到乙個[.o]檔案,它就會自動的把[.c]檔案加在依賴關係中,如果make找到乙個whatever.o,那麼whatever.c,就會是whatever.o的依賴檔案。並且 cc -c whatever.c 也會被推導出來,於是,我們的makefile再也不用寫得這麼複雜。我們的是新的makefile又出爐了。

cflags = -wall

objects= main.o run.o \

speak.o eat.o sleep.o

main : $(objects)

gcc $(cflags) -o main $(objects)

eat.o main.o : eat.h

run.o main.o : run.h

speak.o main.o : speak.h

sleep.o main.o : sleep.h

.phony : clean

clean :

-rm $(objects) main

.phony : clean

clean :

-rm edit $(objects)

為了避免和檔案重名的這種情況,我們可以使用乙個特殊的標記「.phony」來顯示地指明乙個目標是「偽目標」,向make說明,不管是否有這個檔案,這個目標就是「偽目標」。

在rm命令前面加了乙個小減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。當然,clean的規則不要放在檔案的開頭,不然,這就會變成make的預設目標,相信誰也不願意這樣。不成文的規矩是——「clean從來都是放在檔案的最後」。

Makefile教程 三 Makefile 總述

makefile裡主要包含了五個東西 顯式規則 隱晦規則 變數定義 檔案指示和注釋。顯式規則說明了,如何生成乙個或多的的目標檔案。這是由makefile的書寫者明顯指出,要生成的檔案,檔案的依賴檔案,生成的命令。由於我們的make有自動推導的功能,所以隱晦的規則可以讓我們比較粗糙地簡略地書寫make...

Makefile教程 六 MakeFile使用函式

一 if函式 if函式很像gnu的make所支援的條件語句 ifeq,if函式的語法是 if 或是 if 可見,if函式可以包含 else 部分,或是不含。即if函式的引數可以是兩個,也可以是三個。引數是if的表示式,如果其返回的為非空字串,那麼這個表示式就相當於返回真,於是,會被計算,否則會被計算...

Makefile簡易教程

在軟體開發中,make通常被視為一種軟體構建工具。該工具主要經由讀取一種名為 makefile 或 makefile 的檔案來實現軟體的自動化建構。它會通過一種被稱之為 target 概念來檢查相關檔案之間的依賴關係,這種依賴關係的檢查系統非常簡單,主要通過對比檔案的修改時間來實現。在大多數情況下,...