makefile中的all和 PHONY的作用

2021-09-24 02:43:10 字數 2203 閱讀 6018

main1.c:

#include

int main(void)

printf("main1\n");

main2.c:

#include

int main(void)

printf("main2\n");

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

makefile:

all:main1 main2main1: 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 main2cleanmain1: 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仍然存在,怎麼回事呢原來這裡的目標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中的all和 PHONY的作用

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

makefile中的 PHONY和all的作用

偽目標是這樣乙個目標 它不代表乙個真正的檔名,在執行make時可以指定這個目標來執行所在規則定義的命令,有時也可以將乙個偽目標稱為標籤。偽目標通過phony來指明。phony定義偽目標的命令一定會被執行,下面嘗試分析這種優點的妙處。1 如果我們指定的目標不是建立目標檔案,而是使用makefile執行...

makefile中的all和 PHONY的作用

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