如果在Linux下玩不轉Makefile,那你真out了,這應該是Makefile較爲精華的部分,難得共享。
一、一個簡單通用的Makefile例子
1.編寫源文件
5個源文件:A.c B.c C.c D.c main.c
5個頭文件:A.h B.h C.h D.h main.h(工作中其實main.h可以不用的,也不用生成main.o)
在同一目錄,不同目錄下,如果目錄多,一般用autotools生成Makefile。可鏈接:autotools生成Makefile(一)http://blog.csdn.net/huangminqiang201209/article/details/8271752
2.編寫Makefile
#this is Makefile file
#include Makefile.param
OBJECTS= main.o A.o\
B.o C.o D.o
main : $(OBJECTS)
gcc –o main $( OBJECTS)
main.o : main.c main.h
A.o : A.h
B.o : B.h
C.o : C.h
D.o : D.h
.PHONY : clean
clean:
-rm $(OBJECTS) main
Makefile文件說明:
1) Makefile.param中多是一些變量的定義,“include"指示符告訴make暫停讀取當前的Makefile,而轉去讀取“include”指定的Makefile.param,完成以後再繼續當前Makefile的讀取。Makefile中指示符“include”書寫在獨立的一行,指示符“include”所在的行可以一個或者多個空格(make程序在處理時將忽略這些空格)開始,切忌不能以[Tab]字符開始(如果一行以[Tab]字符開始make程序將此行作爲一個命令行來處理)。
2)“OBJECTS”作爲一個變量,它代表所有的.o文件的列表,當然也可以使用Makefile的自動化變量$^等等。
3) 可以將一個較長行使用反斜線(\)來分解爲多行,這樣可以使我們的Makefile書寫清晰、容易閱讀理解。但需要注意:反斜線之後不能有空格(這也是大家最容易犯的錯誤,錯誤比較隱蔽)。
4)自動推導規則(隱含規則):對一個目標文件是“N.o”,倚賴文件是“N.c”的規則,完全可以省略其規則的命令行,而由make自身決定使用默認命令,故A.o : A.h省略了A.c以及gcc–c A.c–o A.o這兩步。
5)通過“.PHONY”特殊目標將“clean”目標聲明爲僞目標。避免當磁盤上存在一個名爲“clean”文件時,目標“clean”所在規則的命令無法執行。
6)在命令行之前使用“-”,意思是忽略命令“rm”的執行錯誤。
二、Makefile小結:
1) make通過比較對應文件(規則的目標和依賴,)的最後修改時間,來決定哪些文件需要更新、那些文件不需要更新。
2)每一個命令行必須以[Tab]字符開始,[Tab]字符告訴make此行是一個命令行。
3)Makefile中第一個規則之後的所有以[Tab]字符開始的的行,make程序都會將其交給系統shell程序去解釋執行。
4)一個目標可以沒有依賴而只有動作(指定的命令)即僞目標。比如Makefile中的目標“clean”。
5)書寫規則建議的方式是:單目標,多依賴。就是說盡量要做到一個規則中只存在一個目標文件,可有多個依賴文件。儘量避免多目標,單依賴的方式。