MAKEFILE詳解 規則 二

2021-08-20 20:36:11 字數 2955 閱讀 7053

閱讀小結:target, prerequisites, command, make會比較targets檔案和prerequisites檔案的修改日期, 動作名字label

** make命令執行時,需要乙個makefile 檔案,以告訴make命令需要怎麼樣的去編譯和鏈結程式。 

首先,我們用乙個示例來說明makefile的書寫規則。以便給大家乙個感興認識。這個示例**於gnu的make使用手冊,在這個示例中,我們的工程有8個c檔案,和3個頭檔案,我們要寫乙個makefile來告訴make命令如何編譯和鏈結這幾個檔案。我們的規則是: 

1)如果這個工程沒有編譯過,那麼我們的所有c檔案都要編譯並被鏈結。 

2)如果這個工程的某幾個c檔案被修改,那麼我們只編譯被修改的c檔案,並鏈結目標程式。 

3)如果這個工程的標頭檔案被改變了,那麼我們需要編譯引用了這幾個標頭檔案的c檔案,並鏈結目標程式。 

只要我們的makefile寫得夠好,所有的這一切,我們只用乙個make命令就可以完成,make命令會自動智慧型地根據當前的檔案修改的情況來確定哪些檔案需要重編譯,從而自己編譯所需要的檔案和鏈結目標程式。 

一、makefile的規則 

在講述這個makefile之前,還是讓我們先來粗略地看一看makefile的規則。 

target ... : prerequisites ... 

command 

... 

... 

target也就是乙個目標檔案,可以是object file,也可以是執行檔案。還可以是乙個標籤(label),對於標籤這種特性,在後續的「偽目標」章節中會有敘述。 

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

command也就是make需要執行的命令。(任意的shell命令)

這是乙個檔案的依賴關係,也就是說,target這乙個或多個的目標檔案依賴於prerequisites中的檔案,其生成規則定義在command中。說白一點就是說,prerequisites中如果有乙個以上的檔案比target檔案要新的話,command所定義的命令就會被執行。這就是makefile的規則。也就是makefile中最核心的內容。

說到底,makefile的東西就是這樣一點,好像我的這篇文件也該結束了。呵呵。還不盡然,這是makefile的主線和核心,但要寫好乙個makefile還不夠,我會以後面一點一點地結合我的工作經驗給你慢慢到來。內容還多著呢。:) 

二、乙個示例 

正如前面所說的,如果乙個工程有3個頭檔案,和8個c檔案,我們為了完成前面所述的那三個規則,我們的makefile應該是下面的這個樣子的。 

edit : main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

cc -o edit main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

main.o : main.c defs.h 

cc -c main.c 

kbd.o : kbd.c defs.h command.h 

cc -c kbd.c 

command.o : command.c defs.h command.h 

cc -c command.c 

display.o : display.c defs.h buffer.h 

cc -c display.c 

insert.o : insert.c defs.h buffer.h 

cc -c insert.c 

search.o : search.c defs.h buffer.h 

cc -c search.c 

files.o : files.c defs.h buffer.h command.h 

cc -c files.c 

utils.o : utils.c defs.h 

cc -c utils.c 

clean : 

rm edit main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

反斜槓(\)是換行符的意思。這樣比較便於makefile的易讀。我們可以把這個內容儲存在檔案為「makefile」或「makefile」的檔案中,然後在該目錄下直接輸入命令「make」就可以生成執行檔案edit。如果要刪除執行檔案和所有的中間目標檔案,那麼,只要簡單地執行一下「make clean」就可以了。 

在這個makefile中,目標檔案(target)包含:執行檔案edit和中間目標檔案(*.o),依賴檔案(prerequisites)就是冒號後面的那些 .c 檔案和 .h檔案。每乙個 .o 檔案都有一組依賴檔案,而這些 .o 檔案又是執行檔案 edit 的依賴檔案。依賴關係的實質上就是說明了目標檔案是由哪些檔案生成的,換言之,目標檔案是哪些檔案更新的。 

在定義好依賴關係後,後續的那一行定義了如何生成目標檔案的作業系統命令,一定要以乙個tab鍵作為開頭。記住,make並不管命令是怎麼工作的,他只管執行所定義的命令。make會比較targets檔案和prerequisites檔案的修改日期,如果prerequisites檔案的日期要比targets檔案的日期要新,或者target不存在的話,那麼,make就會執行後續定義的命令。

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

makefile詳解 定義模式規則

五 定義模式規則 你可以使用模式規則來定義乙個隱含規則。乙個模式規則就好像乙個一般的規則,只是在規則中,目標的定義需要有 字元。的意思是表示乙個或多個任意字元。在依賴目標中同樣可以使用 只是依賴目標中的 的取值,取決於其目標。有一點需要注意的是,的展開發生在變數和函式的展開之後,變數和函式的展開發生...

Makefile常用規則

表示目標檔案 表示所有的依賴檔案 表示第乙個依賴檔案 表示比目標還要新的依賴檔案列表 同樣表示所有依賴目標的集合 不去除重複的依賴目標 makefile變數使用 或者 或 者 來呼叫,如果是shell變數,則需要使用 來引用。一種變數替換方法 src a.c b.c obj src o c 變數賦值...

makefile編寫規則

目標 要生成的目標檔案 依賴 目標檔案由哪些檔案生成 命令 通過執行該命令由依賴檔案生成目標 代表目標 代表全部依賴 第一依賴 第一變化的依賴 2020 8 3 wildcard可以進行檔案匹配 patsubst 內容的替換 makefile的變數 代表目標 代表全部依賴 第一依賴 第一變化的依賴 ...