Makefile目標型別大彙總

2021-10-20 22:20:53 字數 3207 閱讀 8116

這個章節主要講解的是模式規則中的目標。規則中的目標形式是多種多樣的,它可以是乙個或多個的檔案、可以是乙個偽目標,這是我們之前講到過的,也是經常使用的。其實規則目標還可以是其他的型別,下面是對這些型別的詳細的說明。

強制目標

如果乙個目標中沒有命令或者是依賴,並且它的目標不是乙個存在的檔名,在執行此規則時,目標總會被認為是最新的。就是說:這個規則一旦被執行,make 就認為它的目標已經被更新過。這樣的目標在作為乙個規則的依賴時,因為依賴總被認為更新過,因此作為依賴在的規則中定義的命令總會被執行。看乙個例子:

clean:force

rm $(objects)

force:

這個例子中,目標 "force" 符合上邊的條件。它作為目標 "clean" 的依賴,在執行 make 的時候,總被認為更新過。因此 "clean" 所在的規則而在被執行其所定義的那個命令總會被執行。這樣的乙個目標通常我們將其命名為 "force"。

例子中使用 "force" 目標的效果和將 "clean" 宣告為偽目標的效果相同。

空目標檔案

空目標檔案是偽目標的乙個變種,此目標所在的規則執行的目的和偽目標相同——通過 make 命令列指定將其作為終極目標來執行此規則所定義的命令。和偽目標不同的是:這個目標可以是乙個存在的檔案,但檔案的具體內容我們並不關心,通常此檔案是乙個空檔案。

空目標檔案只是用來記錄上一次執行的此規則的命令的時間。在這樣的規則中,命令部分都會使用 "touch" 在完成所有的命令之後來更新目標檔案的時間戳,記錄此規則命令的最後執行時間。make 時通過命令行將此目標作為終極目標,當前目標下如果不存在這個檔案,"touch" 會在第一次執行時建立乙個的檔案。

通常,乙個空目標檔案應該存在乙個或者多個依賴檔案。將這個目標作為終極目標,在它所依賴的檔案比它更新時,此目標所在的規則的命令行將被執行。就是說如果空目標檔案的依賴檔案被改變之後,空目標檔案所在的規則中定義的命令會被執行。看乙個例子:

print:foot.c bar.c

lpr -p $?

touch print

執行 "make print" ,當目標檔案 "print" 的依賴檔案被修改之後,命令 "lpr -p $?" 都會被執行,列印這個被修改的檔案。

特殊的目標

名稱功能

.phony:

這個目標的所有依賴被作為偽目標。偽目標是這樣乙個目標:當使用 make 命令列指定此目標時,這個目標所在的規則定義的命令、無論目標檔案是否存在都會被無條件執行。

.suffixes:

這個目標的所有依賴指出了一系列在字尾規則中需要檢查的字尾名

.default:

makefile 中,這個特殊目標所在規則定義的命令,被用在重建那些沒有具體規則的目標,就是說乙個檔案作為某個規則的依賴,卻不是另外乙個規則的目標時,make 程式無法找到重建此檔案的規則,這種情況就執行 ".default" 所指定的命令。

.precious:

這個特殊目標所在的依賴檔案在 make 的過程中會被特殊處理:當命令執行的過程中斷時,make 不會刪除它們。而且如果目標的依賴檔案是中間過程檔案,同樣這些檔案不會被刪除。

.intermediate:

這個特殊目標的依賴檔案在 make 執行時被作為中間檔案對待。沒有任何依賴檔案的這個目標沒有意義。

.secondary:

這個特殊目標的依賴檔案被作為中過程的檔案對待。但是這些檔案不會被刪除。這個目標沒有任何依賴檔案的含義是:將所有的檔案視為中間檔案。

.ignore

這個目標的依賴檔案忽略建立這個檔案所執行命令的錯誤,給此目標指定命令是沒有意義的。當此目標沒有依賴檔案時,將忽略所有命令執行的錯誤。

.delete_on_error:

如果在 makefile 中存在特殊的目標 ".delete_on_error" ,make 在執行過程中,榮國規則的命令執行錯誤,將刪除已經被修改的目標檔案。

.low_resolution_time:

這個目標的依賴檔案被 make 認為是低解析度時間戳檔案,給這個目標指定命令是沒有意義的。通常的目標都是高解析度時間戳。

.silent:

出現在此目標 ".silent" 的依賴檔案列表中的檔案,make 在建立這些檔案時,不列印出此檔案所執行的命令。同樣,給目標 "silent" 指定命令列是沒有意義的。

.export_all_variables:

此目標應該作為乙個簡單的沒有依賴的目標,它的功能是將之後的所有變數傳遞給子 make 程序。

.notparallel:

makefile 中如果出現這個特殊目標,則所有的命令按照序列的方式執行,即使是存在 make 的命令列引數 "-j" 。但在遞迴呼叫的子make程序中,命令列可以並行執行。此目標不應該有依賴檔案,所有出現的依賴檔案將會被忽略。

多規則目標

makefile 中,乙個檔案可以作為多個規則的目標。這種情況時,以這個檔案為目標的規則的所有依賴檔案將會被合併成此目標乙個依賴檔案列表,當其中的任何乙個依賴檔案比目標更新時,make 將會執行特定的命令來重建這個目標。

對於乙個多規則的目標,重建這個目標的命令只能出現在乙個規則中。如果多個規則同時給出重建此目標的命令,make 將使用最後乙個規則中所定義的命令,同時提示錯誤資訊。某些情況,需要對相同的目標使用不同的規則中所定義的命令,我們需要使用另一種方式——雙冒號規則來實現。

乙個僅僅描述依賴關係的描述規則可以用來給出乙個或者時多個目標檔案的依賴檔案。例如,makefile 中通常存在乙個變數,就像我們以前提到的 "objects" ,它定義為所有的需要編譯的生成 .o 檔案的列表。這些 .o 檔案在其原始檔中包含的標頭檔案 "config.h" 發生變化之後能夠自動的被重建,我們可以使用多目標的方式來書寫 makefile:

objects=foo.o bar.o

foo.o:defs.h

bar.o:defs.h test.h

$(objects):config.h

這樣做的好處是:我們可以在原始檔增加或者刪除了包含的標頭檔案以後不用修改已存在的 makefile 的規則,只需要增加或者刪除某乙個 .o 檔案依賴的標頭檔案。這種方式很簡單也很方便。

我們也可以通過乙個變數來增加目標的依賴檔案,使用 make 的命令列來指定某乙個目標的依賴標頭檔案,例如:

extradeps=

$(objects):$(exteradeps)

它的意思是:如果我們執 "make exteradeps=foo.h" 那麼 "foo.h" 將作為所有的 .o 檔案的依賴檔案。當然如果只執行 "make" 的話,就沒有指定任何檔案作為 .o 檔案的依賴檔案。

Makefile的特殊目標

makefile的特殊目標 在makefile中,有一些名字,當它們作為規則的目標時,具有特殊含義。它們是一些特殊的目標,gnu make所支援的特殊的目標有 phony 目標 phony 的所有的依賴被作為偽目標。偽目標時這樣乙個目標 當使用make命令列指定此目標時,這個目標所在規則定義的命令 ...

makefile之偽目標

偽目標的目的不是根據依賴關係生成某個目標,而是為了執行某種任務 clean rm o 通過 make clean來使用目標小結 1.因為我們並不是生成clean這個檔案,因此 偽目標 並不是乙個檔案,只是乙個標籤。2.由於 偽目標 不是檔案,所以 make 無法生成它的依賴關係和決定它是否要執行,因...

目標檢測彙總

一 傳統的目標檢測一般使用滑動視窗的框架,主要包括三個步驟 利用不同尺寸的滑動視窗框住圖中的某一部分作為候選區域 提取候選區域相關的視覺特徵。比如人臉檢測常用的harr特徵 行人檢測和普通目標檢測常用的hog特徵等 利用分類器進行識別,比如常用的svm模型。基於深度學習的目標檢測分為兩派 基於區域提...