在先前的文章中,我們已經學習了 gcc 和 gdb 的使用。本節,我們將介紹 makefile 的使用。makefile帶來的好處就是——「自動化編譯」,一但寫好,只需要乙個 make 命令,整個工程便可以完全編譯,極大的提高了軟體的開發效率(特別是對於那些專案較大、檔案較多的工程)。
make是乙個命令工具,最主要也是最基本的功能就是根據makefile檔案中描述的源程式至今的相互關係來完成自動編譯、維護多個原始檔工程。
而makefile檔案需要按某種語法進行編寫,檔案中需要說明如何編譯各個原始檔並鏈結生成可執行檔案,要求定義原始檔之間的依賴關係。
下面從乙個簡單例項入手,介紹如何編寫makefile。假設現在有乙個簡單的專案由幾個檔案組成:prog.c、 code.c、 code.h。這些檔案的內容如下:
prog.c
#include #include "code.h"
int main(void)
code.c
#include "code.h"
int myfun(int in)
code.h
extern int myfun(int);
這些程式都比較短,結構也很清晰,因此使用下面的命令進行編譯:
$ gcc -c code.c -o code.o
$ gcc -c prog.c -o prog.o
$ gcc prog.o code.o -o test
如上所示,這樣就能生成可執行檔案test,由於程式比較簡單,而且數量也比較少,因此看不出來有多麻煩。但是,試想如果不只上面的3個檔案,而是幾十個或者是成百上千個甚至更多,那將是非常複雜的問題。
那麼如何是好呢?這裡就是makefile的絕佳舞台,下面是乙個簡單的makefile的例子。
首先$ vim makefile
test: prog.o code.o
gcc prog.o code.o -o test
prog.o: prog.c code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o test
有了這個makefile,不論什麼時候修改原始檔,只要執行一下make命令,所有必要的重新編譯將自動執行。make程式利用makefile中的資料,生成並遍歷以test為根節點的樹;現在我們以上面的例項,來學習一下makefile的一般寫法:
test(目標檔案): prog.o code.o(依賴檔案列表)
tab(至少乙個tab的位置) gcc prog.o code.o -o test(命令)
.......
乙個makefile檔案主要含有一系列的規則,每條規則包含以下內容:乙個目標,即make最終需要建立的檔案,如可執行檔案和目標檔案;目標也可以是要執行的動作,如『clean』;乙個或多個依賴檔案的列表,通常是編譯目標檔案所需要的其他檔案。之後的一系列命令,是make執行的動作,通常是把指定的相關檔案編譯成目標檔案的編譯命令,每個命令佔一行,並以tab開頭(務必注意:是tab,而不是空格) 執行以上makefile後就會自動化編譯:
$ make
gcc -c prog.c -o prog.o
gcc -c code.c -o code.o
gcc prog.o code.o -o test
最後就會多產生: porg.o code.o test這三個檔案,執行./test
檢視結果
還記得makefile中的clean
嗎?make clean
就會去執行rm -f *.o test
這條命令,完成 clean 操作。
makefile還可以定義和使用巨集(也稱做變數),從而使其更加自動化,更加靈活,在makefile中定義巨集的格式為:
macroname = macrotext
使用巨集的格式為:
$(macroname)
我們用 「巨集」 的方式,來改寫上面的 makefile 例子。
objs = prog.o code.o
cc = gcc
test: $(bojs)
$(cc) $(objs) -o test
prog.o: prog.c code.h
$(cc) -c prog.c -o prog.o
code.o: code.c code.h
$(cc) -c code.c -o code.o
clean:
rm -f *.o test
linux程式設計 makefile檔案
今天我想說說這個makefile檔案了,makefile檔案?可能是我孤陋寡聞吧,原來在windows平台上我還真沒有聽說過這個東東,其實也是有的,只是我們沒有接觸到罷了。makefile檔案,是個什麼東西?有什麼用?怎麼來寫?這就是我要說的。我們都清楚,用傳統c c 語言開發乙個程式,都要經歷這幾...
linux程式設計 Makefile檔案
linux程式設計 makefile檔案 今天我想說說這個makefile檔案了,makefile檔案?原來在windows平台上我還真沒有弄過這個東東,其實也是有的,只是我們沒有接觸到罷了。makefile檔案,是個什麼東西?有什麼用?怎麼來寫?這就是我要說的。我們都清楚,用傳統c c 語言開發乙...
linux程式設計工具makefile
linux中對大量的工程檔案進行編譯,通常利用make工具來自動完成編譯,make工具通過乙個makefile makefile 檔案來完成自動維護編譯工作。makefile基本規則 分為三部分 target dependencies tab鍵 command 目標 target 需要生成的目標檔案...