偽目標 多目標 override 指示符

2021-09-08 02:25:14 字數 2491 閱讀 5205

最早先的乙個例子中,我們提到過乙個「clean」的目標,這是乙個「偽目標」,

clean:

rm *.o temp

正像我們前面例子中的「clean」一樣,即然我們生成了許多檔案編譯檔案,我們也應該提供乙個清除它們的「目標」以備完整地重編譯而用。 (以「make clean」來使用該目標)

因為,我們並不生成「clean」這個檔案。「偽目標」並不是乙個檔案,只是乙個標籤,由於「偽目標」不是檔案,所以make無法生成它的依賴關係和決定它是否要執行。我們只有通過顯示地指明這個「目標」才能讓其生效。當然,「偽目標」的取名不能和檔名重名,不然其就失去了「偽目標」的意義了。

當然,為了避免和檔案重名的這種情況,我們可以使用乙個特殊的標記「.phony」來顯示地指明乙個目標是「偽目標」,向make說明,不管是否有這個檔案,這個目標就是「偽目標」。

.phony : clean

只要有這個宣告,不管是否有「clean」檔案,要執行「clean」這個目標,只有「make clean」這樣。於是整個過程可以這樣寫:

.phony: clean

clean:

rm *.o temp

偽目標一般沒有依賴的檔案。但是,我們也可以為偽目標指定所依賴的檔案。偽目標同樣可以作為「預設目標」,只要將其放在第乙個。乙個示例就是,如果你的makefile需要一口氣生成若干個可執行檔案,但你只想簡單地敲乙個make完事,並且,所有的目標檔案都寫在乙個makefile中,那麼你可以使用「偽目標」這個特性:

all : prog1 prog2 prog3

.phony : all

prog1 : prog1.o utils.o

cc -o prog1 prog1.o utils.o

prog2 : prog2.o

cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o

cc -o prog3 prog3.o sort.o utils.o

我們知道,makefile中的第乙個目標會被作為其預設目標。我們宣告了乙個「all」的偽目標,其依賴於其它三個目標。由於偽目標的特性是,總是被執行的,所以其依賴的那三個目標就總是不如「all」這個目標新。所以,其它三個目標的規則總是會被決議。也就達到了我們一口氣生成多個目標的目的。「.phony : all」宣告了「all」這個目標為「偽目標」。

隨便提一句,從上面的例子我們可以看出,目標也可以成為依賴。所以,偽目標同樣也可成為依賴。看下面的例子:

.phony: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff

rm program

cleanobj :

rm *.o

cleandiff :

rm *.diff

「make clean」將清除所有要被清除的檔案。「cleanobj」和「cleandiff」這兩個偽目標有點像「子程式」的意思。我們可以輸入「make cleanall」和「make cleanobj」和「make cleandiff」命令來達到清除不同種類檔案的目的。

多目標

makefile的規則中的目標可以不止乙個,其支援多目標,有可能我們的多個目標同時依賴於乙個檔案,並且其生成的命令大體類似。於是我們就能把其合併起來。當然,多個目標的生成規則的執行命令是同乙個,這可能會可我們帶來麻煩,不過好在我們的可以使用乙個自動化變數「$@」(關於自動化變數,將在後面講述),這個變數表示著目前規則中所有的目標的集合,這樣說可能很抽象,還是看乙個例子吧。

bigoutput littleoutput : text.g

generate text.g -$(subst output,,$@) >; $@

上述規則等價於:

bigoutput : text.g

generate text.g -big >; bigoutput

littleoutput : text.g

generate text.g -little >; littleoutput

其中,-$(subst output,,$@)中的「$」表示執行乙個makefile的函式,函式名為subst,後面的為引數。關於函式,將在後面講述。這裡的這個函式是擷取字串的意思,「$@」表示目標的集合,就像乙個陣列,「$@」依次取出目標,並執於命令。

五、override 指示符

如果有變數是通常make的命令列引數設定的,那麼makefile中對這個變數的賦值會被忽略。如果你想在makefile中設定這類引數的值,那麼,你可以使用「override」指示符。其語法是:

override ; = ;

override ; := ;

當然,你還可以追加:

override ; += ;

對於多行的變數定義,我們用define指示符,在define指示符前,也同樣可以使用ovveride指示符,如:

override define foo

bar

endef

多目標跟蹤

目前參與的乙個專案是 足球事件檢索 事件是乙個 high level 概念,需要基於一些 low level 資訊來做。後者主要就是一些影象處理的東西了。兩個 level 之間,會有一些中間層的資訊,比如足球的走向。根據師兄的建議,可以考慮對足球場上的運動員進行多目標跟蹤,在跟蹤軌跡的基礎上抽取一些...

多目標優化問題 投資組合的多目標優化

一 多目標問題 二 多目標規劃有效解 1 有效點 參考定理 2 凸多目標規劃 詳細見參考文獻1 3 絕對最優解 有效解 弱有效解 絕對最優解 有效解與弱有效解 4 真有效解 由於有效解的範圍過大,有時候要在要在有效解的範圍內加以限制定義了真有解。根據不同的限制定義了許多不同的真有效解。5 極錐解與非...

多目標模板匹配

一.模板匹配 模板匹配是數字影象處理的重要組成部分之一。把不同感測器或同一感測器在不同時間 不同成像條件下對同一景物獲取的兩幅或多幅影象在空間上對準,或根據已知模式到另一幅圖中尋找相應模式的處理方法就叫做模板匹配。簡單而言,模板就是一幅已知的小影象。模板匹配就是在一幅大影象中搜尋目標,已知該圖中有要...