makefile高階(一) 目標target

2021-06-05 21:17:56 字數 2241 閱讀 4934

本文由導學寶**:

(首先宣告,本文摘自《跟我一起寫 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年,在東京國際馬拉松邀請賽中,名...