作爲Linux或Unix下的程序開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便。一般開發情況下,大家都是手工寫一個簡單Makefile。下面先給一個最簡單的示例代碼:
#makefile示例 object= main.o function.o change:$(object) cc -o change $(object) mv change $(HOME)/bin main.o: cc -c main.c -I$(HOME)/program/date/include function.o: cc -c function.c -I$(HOME)/program/date/include clean: rm change $(object)說明:
這裏是使用unix下的CC編譯器,當然也能換成gcc
最後生成的可執行文件名:change
源程序文件:main.c function.c
.h文件(頭文件)所在目錄:$(HOME)/program/date/include
中間目標文件名:main.o function.o
當在shall中執行命令:
make clean將會執行
rm change $(object)刪除文件: change main.o function.o
語句:
mv change $(HOME)/bin將最終生成的可執行文件移動到
$(HOME)/bin這一步可以不要,但這樣符合目錄管理規範,而且$(HOME)/bin一般在環境變量PATH中有設置,這樣可以在任意目錄下時也能運行可執行文件。
注意:
makefile編輯時另起一行,注意不能用空格,要用TAB鍵,否則會報錯
makefile裏面的註釋用#,其它都會報錯
Makefile簡單介紹
Makefile是用於自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀錄有文件的信息,在make時會決定在鏈接的時候需要重新編譯哪些文件。
Makefile的宗旨就是:讓編譯器知道要編譯一個文件需要依賴其他的哪些文件。當那些依賴文件有了改變,編譯器會自動的發現最終的生成文件已經過時,而重新編譯相應的模塊。
一個簡單的MakeFile例子
一、程序的編譯及鏈接
我們編譯程序,無非是想要得到一個可執行文件,而這個過程則是經過這兩步:
***.c->編譯->***.o->鏈接->可執行文件。即.c經過編譯得到.o文件,.o文件是一箇中間文件,再對這些中間文件進行鏈接最終可得到可執行文件。
二、Makefile的規則
首先,來看一看Makefile的書寫規則:
target ... : prerequisites ...
command
...
...
target也就是一個目標文件,可以是.o文件,也可以是執行文件,還可以是一個標籤(Label)。
prerequisites就是,要生成那個target所需要的文件或是目標。
command也就是make需要執行的命令(任意的Shell命令)。這裏要注意的是在命令前面要加上一個tab鍵,不是空格,是按一個tab鍵按出來的空格。
這是一個文件的依賴關係,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是Makefile的規則,也就是Makefile中最核心的內容。這是Makefile的主線和核心,但要寫好一個Makefile還得繼續努力。
三、一個最簡單的Makefile例子
如有一個工程,含有3個頭文件及四個c文件,那爲了生成所需的可執行文件,這時的Makefile可以這樣寫:
test:main.o t1.o t2.o t3.o
gcc –o test main.o t1.o t2.o t3.o
main.o:main.c
gcc –c main.c
t1.o:t1.c t1.h
gcc –c t1.c
t2.o:t2.c t2.h
gcc –c t2.c
t3.o:t3.c t3.h
gcc –c t3.c
clean:
rm test main.o t1.o t2.o t3.o
到這裏一個最簡單的makefile就寫好了,把它的名字保存爲Makefile就可以了,這時你只要在終端敲一下make,它就自動幫你編譯鏈接了^_^如果敲入make clean,它將刪掉那些中間文件及可執行文件。