本文由導學寶**:
(首先宣告,本文摘自《跟我一起寫 makefile》作者陳皓 (csdn),他的msn是: [email protected]。我後面三章基本是直接拷過來的,前面的倒是按照自己的理解碼的,例子和解釋會有不同。)
一般來說,乙個target是乙個要生成的檔案,它會有乙個或多個依賴的目標。比如:
foo.o: foo.c
表示要生成的檔案為foo.o,而依賴的檔案是foo.c。make會自動為我們執行類似於cc foo.c -o foo.o的命令。
這裡make在每次執行時會比較依賴檔案與目標檔案的更新時間,如果foo.c比foo.o更新,那麼說明foo.c在上次編譯後改動過,所以foo.o會再次編譯;否則make假定foo.o已經是最新,不再編譯。
對於標頭檔案,我們也應該把它加入到依賴目標集裡。就像:
foo.o: foo.c foo.h
這是因為如果不加入標頭檔案的依賴,那麼在上次編譯後即使foo.h有改動,make也認為foo.o為最新。
make的自動推導可以為目標指定相應的原始檔作為依賴目標。
比如makefile這麼寫:
foo.o:
會等同於
foo.o: foo.c
make它的話,會有如下結果:
$ make foo.o
cc -c -o foo.o foo.c
對於不是檔案的目標,我們稱之為
「偽目標」
,比如clean:,它只是乙個標籤。我們可以用.phony來顯式地宣告乙個目標是偽目標,這樣不管是否存在這個檔案,目標都被視為是偽目標。比如:
.phony: clean
clean:
rm *.o
同樣,一旦我們宣告
phony:foo.o,
那麼foo.o就不會被生成。
有一點要注意的是,make會檢查檔案目標的更新時間,如果已有的目標檔案比原始檔新,那麼這個目標就不會執行;但是偽目標總是會執行。
我們可以
同時指定多個目標,來執行相同的命令,
變數$@
指定當前的目標名。比如:
tone ttwo: foo2.o foo3.o
echo $@
make命令會生成:
$ make tone
cc -c -o foo2.o src1/foo2.c
cc -c -o foo3.o src2/foo3.c
echo tone
tone
多個目標其實會被展開,上面的例子其實等價於:
tone: foo2.o foo3.o
echo $@
ttwo: foo2.o foo3.o
echo $@
我們可以使用
靜態模式來從根據目標來指定依賴的目標集。靜態模式的語法為:
: :先舉個例子:
objects=foo1.o foo2.o
all: foo1.o foo2.o
$(objects):%.o:src1/%.c
$(cc) -c -o $@ "$<"
這 裡是foo1.o和foo2.o;是%.o;為src1/%c。兩個pattern中的「%」是必需的。靜態模式就是需要從所有targets中抽取匹配「%」的部 分,再由這個部分生成信賴目標集。如之前所說的,$@是目標名,而$《是依賴目標集名。
上面的靜態模式展開後等價於:
$foo1.o:src1/foo1.c
$(cc) -c -o foo1.o "src1/foo1.c"
$foo1.o:src2/foo2.c
$(cc) -c -o foo2.o "src1/foo2.c"
再舉個例子來加深對靜態模式的理解:
tall: tax tbx tcx
tax tbx tcx:t%x:%1 %2 %3
a1 a2 a3:
echo $@
b1 b2 b3:
echo $@
c1 c2 c3:
echo $@
make產生的結果為:
$ make tall
echo a1
a1echo a2
a2echo a3
a3echo b1
b1echo b2
b2echo b3
b3echo c1
c1echo c2
c2echo c3
c3
About Face 一 目標導向設計
1.目標導向設計 設計是 為賦予有意義的秩序,做出有意識或直覺的努力 以人為導向的設計活動 當今數字產品的一些問題 原因 2.實現模型和心理模型 使用者介面應該按照使用者心理模型來實現,但當今大多數軟體是按照實現模型來設計的。3.新手 專家和中間使用者 大多數是中間使用者,沒有人願意停留在新手級別。...
階段總結 研一目標
開學差不多也兩個月了,該了解的也了解了,對學校的狀況也做到了基本心裡有數,確實需要定個計畫來督促自己的學習。研一一年目標 目前,研一一年的目標是學習c c 學習資料庫,學習linux作業系統,學習網路相關知識等,最重要的是提高自己的 能力。爭取在研一結束後找個實習。同時,也希望能夠遇到自己的另一半。...
怎樣設定目標(一) 目標金字塔
目標對我們的成功至關重要,可知道目標的重要意義並沒用。當你想要執行某項行動時,制定目標就是第一步。如果你想要乙個懶人動起來,與其打他罵他,不如給他乙個強大的目標,促使他行動。目標就是動力,目標就是方向,制定目標應該成為我們生活的一種習慣,怎麼制定我們的目標呢?1984年,在東京國際馬拉松邀請賽中,名...