偽目標是這樣乙個目標:它不代表乙個真正的檔名,在執行make時可以指定這個目標來執行所在規則定義的命令,有時也可以將乙個偽目標稱為標籤。偽目標通過phony來指明。
phony定義偽目標的命令一定會被執行,下面嘗試分析這種優點的妙處。
1、如果我們指定的目標不是建立目標檔案,而是使用makefile執行一些特定的命令,例如:
我們希望,只要輸入」make clean「後,」rm *.o temp「命令就會執行。但是,當當前目錄中存在乙個和指定目標重名的檔案時,例如clean檔案,結果就不是我們想要的了。輸入」make clean「後,「rm *.o temp」 命令一定不會被執行。clean:
rm *
.o temp
解決的辦法:將目標clean定義成偽目標就成了 無論當前目錄下是否存在「clean」這個檔案,輸入「make clean」後,「rm *.o temp」命令都會被執行。
注意:這種做法的帶來的好處還不止此,它同時提高了make的執行效率,因為將clean定義成偽目標後,make的執行程式不會試圖尋找clean的隱含規則。
2、phony可以確保原始檔(*.c *.h)修改後,對應的目標檔案會被重建。
main1.c:
main2.c:#include
intmain
(void
)
【分析】:這裡需要生成兩個可執行檔案main1和main2(兩個目標)。由於makefile只能有乙個目標,所以可以構造乙個沒有規則的終極目標all,並以這兩個可執行檔案作為依賴。如下:#include
int main(void)
很多時候我們在執行make時會產生許多過程檔案,比如將上面的makefile改為:makefile:
all:main1 main2
main1: main1.c
gcc main1.c -o main1
main2: main2.c
gcc main2.c -o main2
makefile:
這樣就會生成乙個我們不需要的過程檔案main2.o。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
如果希望將生成的過程檔案刪掉,根據前面再增加乙個目標clean:
但是當我們make之後main2.o仍然存在,怎麼回事呢makefile中的all和.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
clean:
rm -f main2.o
原來這裡的目標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
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只能有乙個目標,所以可以構造乙個沒有規則...