精簡Makefile

    如果在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以及gccc A.co 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)書寫規則建議的方式是:單目標,多依賴。就是說盡量要做到一個規則中只存在一個目標文件,可有多個依賴文件。儘量避免多目標,單依賴的方式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章