第3課 makefile偽目標的引入

2022-02-21 13:34:12 字數 2732 閱讀 2614

(1)預設情況下,make 認為目標對應著乙個檔案==>  目標即檔名

(2)make首先會檢測目標對應的檔案是否存在,若不存在則執行依賴和命令。若存在則會比較目標檔案和依賴檔案的新舊關係,決定是否執行命令。

在 make 中,通過比較目標檔案和依賴檔案的時間戳,來判斷兩者的新舊關係。make 程式使用的時間戳的型別是mtime(modify time),即檔案發生修改的時間。

在 linux 中,有三個時間的概念,修改時間mtime(modify time)、訪問時間atime(access time)、狀態改動時間ctime(change time)。

(3)make 以檔案處理作為第一優先順序。

下面的**有什麼意義?   

執行make clean會將第2課中編譯生成的中間.o檔案和hello.out目標檔案刪除。但如果該目錄下存在名為 clean 的檔案就會導致刪除命令執行失敗。

有時我們並不希望目標對應的都是檔案,而只是把目標當作乙個標籤來使用,這就引入了makefile中的偽目標。

(1)makefile 中的偽目標

(2)makefile 偽目標的語法:先宣告,後使用

本質:偽目標是 make 中特殊目標 .phony 的依賴。

程式設計實驗

1

# makefile偽目標的引入

23 hello.out

all : func.o main.o

4 gcc -o hello.out

func.o main.o56

func.o : func.c

7 gcc -o func.o -c func.c89

main.o : main.c

10 gcc -o main.o -c main.c

1112

.phony : clean

13clean :

14rm *.o hello.out

(3)makefile 偽目標的妙用:規則呼叫(函式呼叫)

原理:當乙個目標的依賴包含偽目標時,偽目標所定義的命令總是會被執行。當執行 make rebuild 時首先會刪除之前編譯生成的垃圾檔案,然後重新編譯整個工程。

1

# makefile中利用偽目標實現規則呼叫23

hello.out : func.o main.o

4gcc -o hello.out func.o main.o56

func.o : func.c

7gcc -o func.o -c func.c89

main.o : main.c

10gcc -o main.o -c main.c

1112

.phony : rebuild clean all

1314

rebuild : clean all

1516

all : hello.out

1718

clean :

19rm *.o hello.out

(4)技巧:繞開 .phony 關鍵字定義偽目標

.phony 關鍵字只有標準的make(gnu make)才擁有,在使用非標準的make時可以使用如下技巧定義偽目標。   

原理:如果乙個規則只有乙個目標,並且該目標不是乙個存在的檔名,則在執行此規則時,目標總會被認為是最新的。

當執行 make clean 時,由於 force 會被認為是最新的(force 比 clean 要新),clean 下的命令必然被執行。

1

#非gnu make下偽目標的實現方法23

hello.out : func.o main.o

4gcc -o hello.out func.o main.o56

func.o : func.c

7gcc -o func.o -c func.c89

main.o : main.c

10gcc -o main.o -c main.c

1112

clean : force

13rm *.o hello.out

14 force :

注:本文整理於《狄泰12月提公升計畫》課程內容狄泰qq群:199546072

偽目標的引入

預設情況下 1 make認為目標對應著乙個檔案 2 make比較目標檔案和依賴檔案的新舊關係,決定是否執行命令 3 make以檔案處理作為第一優先順序。1 通過.phony 關鍵字宣告乙個偽目標 2 偽目標不對應任何實際的檔案 3 不管偽目標的依賴是否更新,命令總是執行。本質 偽目標是make中特殊...

makefile之偽目標

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

Makefile中的偽目標

華清遠見嵌入式學院 講師。所謂偽目標就是這樣乙個目標,它不代表乙個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們將乙個偽目標成為標籤。那麼到底什麼是偽目標呢?可能作為初學者還不會在乎這個問題,下面我們來看下我們將在什麼時候需要它。首先來看下面乙個例子 當前目錄下只有...