makefile中phony目標的作用

2021-08-18 01:59:08 字數 2845 閱讀 7834

main1.c:

#include

int main(void)

main2.c:

#include

int main(void)

【分析】:這裡需要生成兩個可執行檔案main1和main2(兩個目標)。由於makefile只能有乙個目標,所以可以構造乙個沒有規則的終極目標all,並以這兩個可執行檔案作為依賴。如下:

makefile:

all:main1 main2

main1: main1.c

@gcc main1.c -o main1

main2: main2.c

@gcc main2.c -o main2

很多時候我們在執行make時會產生許多過程檔案,比如將上面的makefile改為:

makefile:

all:main1 main2

main1: main1.c

@gcc main1.c -o main1

main2: main2.o

@gcc main2.o -o main2

main2.o: main2.c

@gcc -c main2.c 

這樣就會生成乙個我們不需要的過程檔案main2.o。

如果希望將生成的過程檔案刪掉,根據前面再增加乙個目標clean:

all:main1 main2 clean

main1: main1.c

@gcc main1.c -o main1

main2: main2.o

@gcc main2.o -o main2

main2.o: main2.c

@gcc -c main2.c 

clean:

@rm -f main2.o

但是當我們make之後main2.o仍然存在,怎麼回事呢makefile中的all和.phony的作用

原來這裡的目標clean沒有任何依賴,make執行時認為這已經到「根上」了(就是認為磁碟上有clean,就像main2.c),將其忽略(儘管它有規則)。

關鍵字.phony可以解決這問題,告訴make該目標是「假的」(磁碟上其實沒有clean),這時make為生成這個目標就會將其規則執行一次。

.phony修飾的目標就是只有規則沒有依賴。

all:main1 main2 clean

main1: main1.c

@gcc main1.c -o main1

main2: main2.o

@gcc main2.o -o main2

main2.o: main2.c

@gcc -c main2.c 

.phony:clean

clean:

@rm -f main2.o

【附】phony ['fəuni] a. 假的

gnu的make能夠使整個軟體工程的編譯、鏈結只需要乙個命令就可以完成。

makefile的術語:

規則:用於說明如何生成乙個或多個目標檔案

規則的格式:

targets:prerequisites

command

目標: 依賴

命令+++++命令需要以[tab]鍵開始++++

makefile 中的phony

phony 目標

phony 目標並非實際的檔名:只是在顯式請求時執行命令的名字。有兩種理由需要使用phony 目標:避免和同名檔案衝突,改善效能。

如果編寫乙個規則,並不產生目標檔案,則其命令在每次make 該目標時都執行。

例如:clean:

rm *.o temp

因為"rm"命令並不產生"clean"檔案,則每次執行"make clean"的時候,該命令都會執行。如果目錄中出現了"clean"檔案,則規則失效了:沒有依賴檔案,檔案"clean"始終是最新的,命令永遠不會執行;為避免這個問題,可使用".phony"指明該目標。如:

.phony : clean

這樣執行"make clean"會無視"clean"檔案存在與否。

已知phony 目標並非是由其它檔案生成的實際檔案,make 會跳過隱含規則搜尋。這就是宣告phony 目標會改善效能的原因,即使你並不擔心實際檔案存在與否。

完整的例子如下:

.phony : clean

clean :

rm *.o temp

phony 目標不應是真正目標檔案的依賴。如果這樣,每次make 在更新此檔案時,命令都會執行。只要phony 目標不是真正目標的依賴,規則的命令只有在指定此目標時才執行。

phony 目標可以有依賴關係。當乙個目錄中有多個程式,將其放在乙個makefile 中會更方便。因為預設目標是makefile 中的第乙個目標,通常將這個phony 目標叫做"all",其依賴檔案為各個程式:

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

這樣,使用"make"將可以將三個程式都生成了。d

當乙個phony 目標是另乙個的依賴,其作用相當於子程式,例如:

.phony: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff

rm program

cleanobj :

rm *.o

cleandiff :

rm *.diff

MAKEFILE中 PHONY的作用

本文 main1.c include intmain void main2.c include intmain void 分析 這裡需要生成兩個可執行檔案main1和main2 兩個目標 由於makefile只能有乙個目標,所以可以構造乙個沒有規則的終極目標all,並以這兩個可執行檔案作為依賴。如下...

Makefile中 PHONY的作用

拿clean舉例,如果make完成後,自己另外定義乙個名叫clean的檔案,再執行make clean時,將不會執行rm命令。為了避免出現這個問題,需要.phony clean 圖示 1 不新增.phony clean 在makefile所在的目錄下touch乙個clean檔案 執行make 執行m...

makefile中的all和 PHONY的作用

請編寫乙個makefile同時編譯 鏈結下面兩個程式 main1.c include int main void main2.c include int main void 分析 這裡需要生成兩個可執行檔案main1和main2 兩個目標 由於makefile只能有乙個目標,所以可以構造乙個沒有規則...