Linux中的Makefile介紹

2021-08-19 14:27:20 字數 3248 閱讀 1001

1.makefile介紹

在linux中使用make命令來編譯程式,特別是大程式;而make命令所執行的動作依賴於makefile檔案。最簡單的makefile檔案如下:

hello:hello.c

gcc -o hello hello.c //以tab鍵縮排

clean:

rm -f hello //以tab鍵縮排

當乙個資料夾中有hello.c、makefile檔案時,在linux終端中輸入make命令時就可以編譯程式,執行make clean即可清除編譯出來的結果。make命令根據檔案更新的時間戳來決定哪些檔案需要重新編譯,這樣可以避免編譯已經編譯過的、沒有變化的程式,提高了編譯效率,這對大型工程特別有利。

2.makefile規則

乙個簡單的makefile檔案包含一系列的規則,如下所示:

目標(target)...:依賴(prerequiries)

命令(command)

目標(target)通常是要生成檔案的名稱,可以是可執行檔案或obj檔案,如上述的hello就是目標,屬於可執行檔案,

也;可以是執行的動作名稱,如上述的clean。

依賴是用來產生目標的材料,如上述的hello.c,屬於原始檔。

命令是生成目標時所執行的動作,每個命令佔一行,如上述的gcc -o hello hello.c和rm -f hello都是命令。

3.makefile檔案中變數的賦值方法

在gnu make中對變數的賦值方法有兩種方式,分別為延時變數、立即變數。

3.1延時變數

延時變數在使用時才展開,即真正使用的時候這個變數的值才確定使用=?=、或define指令定義。其中?=用來定義第一次出現的延時變數。語法形式如下:

var(變數)=val(值)

var(變數)?=val(值)

define var(變數)

3.2立即變數

立即變數的值在定義的時候就已經確定,語法形式如下:

var(變數):=val(值)
4.makefile中的函式呼叫格式

makefile中的函式呼叫格式如下:

$(function

arguments)

這裡function是函式名,arguments是該函式的引數。引數與函式名之間用空格或tab隔開,如果有多個引數,用逗號隔開。這些空格和逗號不是引數值的一部分。

5.makefile檔案示例

此目下包含以下檔案:main.c、makefile、sub.c、sub.h。makefile的**如下:

//file:makefile

01 src := $(shell ls

*.c)

02 objs := $(patsubst %.c,%.o,$(src))

0304 test: $(objs)

05 gcc -o $@

$^06

07%.o:%.c

08 gcc -c -o $@

$<

0910 clean:

11 rm -f test *.o

上述makefile中$@$^$<稱為自動變數。$@表示規則的目標檔名;$^表示所有依賴的名字,名字之間用空格隔開;$<表示第乙個依賴的檔名。%為萬用字元,它和乙個字串中任意個數的字元相匹配。

第一行src的值為main.c sub.c$(shell ls *.c)是makefile中的函式,是查詢當前目錄下字尾為.c的檔案,*為萬用字元。

第二行objs變數的值為main.o sub.o,是src變數經過patsubst函式處理後得到的。

patsubst為makefile中的函式,為模式字串替換函式。格式如下:

$(patsubst pattern,replacement,text)
尋找text中符合格式pattern的字,用replacement替換它們。比如:

$(patsubst %.c,%.o,x

.c.c bar.c)

結果為:

x

.c.o bar.o

第四行實際上就是:

test:main.o

sub.o

目標test的依賴為main.o和sub.o。開始時這兩個檔案還沒生成,在執行生成test的命令之前,先將main.o、sub.o作為目標查詢合適的規則,以生產main.o、sub.o。

七、八行就是用來生成main.o、sub.o的規則。

main.o的規則如下:

main:main.c

gcc -c -o main.o main.c

sub.o的規則如下:

sub:sub

.c gcc -c -o sub

.osub

.c

這樣,test的依賴main.o和sub.o就生成了。

在終端中輸入make時,會看到如下資訊:

gcc -c -o main.o main.c

gcc -c -o sub

.osub

.cgcc -o test main.o

sub.o

其中test為可執行檔案,在終端中輸入make clean,則可清除編譯生成的檔案。

Linux中Makefile的使用

我也是初學linux,對linux中的編譯產生的一定的厭煩,正巧遇到了makefile。一 makefile的引入 我們現在已有main.c,mymath.c,mymath.h三個檔案,想要此程式能正常執行就需要輸入以下命令進行編譯連線。但是當檔案多了之後就可能需要多個檔名,會產生極大的麻煩。有了m...

linux中的makefile使用

在 linux unix 環境下使用gnu 的make工具能夠比較容易的構建乙個屬於你自己的工程,整個工程的編譯只需要乙個命令就可以完成編譯 連線以至於最後的執行。不過這需要我們投入一些時間去完成乙個或者多個稱之為makefile 檔案的編寫。所寫的makefile 檔案描述了整個工程的編譯 連線等...

關於Linux中Makefile 檔案的使用

大學有陣子做嵌入式的時候覺得makefile簡直高不可攀 教程大多數都在試圖把許多細節都講清楚 沒有跟教程死磕3天的勁頭真的不容易搞懂makefile 而且寫makefile需要一點點gcc編譯器的儲備知識。對於在linux上剛上手的開發者的確有點繞。所以我在這裡做了個最簡版的makefile,看懂...