makefille介紹及用法總結(附示例)
Makefile 介紹
———————
make命令執行時,需要一個 Makefile 檔案,以告訴make命令需要怎麼樣的去編譯和連結程式。
首先,我們用一個示例來說明Makefile的書寫規則。以便給大家一個感興認識。這個示例
來源於GNU的make使用手冊,在這個示例中,我們的工程有8個C檔案,和3個頭檔案,我們要寫一個Makefile來告訴make命令如何編譯和連結這幾個檔案。我們的規則是:
1)如果這個工程沒有編譯過,那麼我們的所有C檔案都要編譯並被連結。
2)如果這個工程的某幾個C檔案被修改,那麼我們只編譯被修改的C檔案,並連結目標程式。
3)如果這個工程的標頭檔案被改變了,那麼我們需要編譯引用了這個標頭檔案的所有
只要我們的Makefile寫得夠好,所有的這一切,我們只用一個make命令就可以完成,make命令會自動智慧地根據當前的檔案修改的情況來確定哪些檔案需要重編譯,從而自己編譯所需要的檔案和連結目標程式。
一、Makefile的規則
在講述這個Makefile之前,還是讓我們先來粗略地看一看Makefile的規則。
target ... : prerequisites ...
【tab鍵】command
...
...
target也就是一個目標檔案,可以是Object File,也可以是執行檔案。還可以是一個標籤
(Label),對於標籤這種特性,在後續的
prerequisites就是,要生成那個target所需要的檔案或是目標。
command也就是make需要執行的命令。(任意的Shell命令)
這是一個檔案的依賴關係,也就是說,target這一個或多個的目標檔案依賴於prerequisi
tes中的檔案,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的檔案比target檔案要新的話,command所定義的命令就會被執行。這就是 Makefile的規則。也就是Makefile中最核心的內容。
說到底,Makefile的東西就是這樣一點,好像我的這篇文件也該結束了。呵呵。還不盡然
,這是Makefile的主線和核心,但要寫好一個Makefile還不夠,我會以後面一點一點地結合我的工作經驗給你慢慢到來。內容還多著呢。:)
二、示例:
第一步:新建makefile資料夾,在makefile資料夾下面新增需要整合的 .c檔案
如:add.c檔案(呼叫函式):
int add(int a,int b)
{
return a + b;
}
sub.c檔案(呼叫函式):
int sub(int a,int b)
{
return a - b;
}
operator.c檔案(主程式)
#include <stdio.h>
int main()
{
int a = 3;
int b = 2;
printf("%d %d\n",add(a,b),sub(a,b));
return 0;
}
第二步:建立makefile,vim makefile並新增規則,
格式target ... : prerequisites ...
【tab鍵】command
如:makefilew檔案
版本1:
operator:add.c sub.c operator.c
gcc add.c sub.c operator.c -o operator
此版本作用是利用make命令將所有.c檔案重新編譯成.o檔案
版本2:
operator:add.o sub.o operator.o
gcc add.o sub.o operator.o -o operator
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
opertor.o:operator.c
gcc -c operator.c -o operator.o
clean:
rm -f *.o operator
此版本的作用與版本1不同的是,利用make命令(make [修改過的檔名])將修改過的.c檔案重新編譯成.o檔案,未修改的不用編譯。這樣大大提高了機器的運算效率。make clean命令是清除所有.o檔案。
版本3:
OBJECT=add.o sub.o operator.o #定義變數
operator:$(OBJECT) #使用變數
cc $(OBJECT) -o operator
clean:
rm -f *.o operator
此版本進一步簡化了操作程式,另外還利用le了makefile自動推導規則的作用
三、總結
makefile 是 make 讀入的唯一配置檔案,因此本節的內容實際就是講述 Makefile 的編寫規則。
1、makefile的基本格式:target:dependency
(Tab字元)command
注:若dependencyt比target日期新或target不存在,則make會執行command
2、makefile中變數的使用
OBJECTS = sum.o sub.o operator.o #定義變數
$(OBJECTS) #使用變數
3、makefile的自動推導(隱晦規則)
GNU的make很強大,它可以自動推導檔案以及檔案依賴關係後面的命令,於是我們就沒必要去在每一個[.o]檔案後都寫上類似的命令,因為,我們的make會自動識別,並自己推導命令。只要make看到一個[.o]檔案,它就會自動的把[.c]檔案加在依賴關係中。如:如果make找到一個main.o,那麼main.c就會是main.o的依賴檔案。並且gcc -c main.c -o main.o也會被推匯出來。