亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Makefile中.PHONY的作用是什么?

Makefile中.PHONY的作用是什么?

繁星coding 2019-10-23 15:12:27
.PHONYMakefile是什么意思?我已經經歷過了,但是它太復雜了。有人可以簡單地向我解釋嗎?
查看完整描述

3 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

默認情況下,Makefile目標是“文件目標”-用于從其他文件構建文件。Make假設其目標是文件,這使得編寫Makefile相對容易:


foo: bar

  create_one_from_the_other foo bar

但是,有時您希望Makefile運行不代表文件系統中物理文件的命令。常見的目標“干凈”和“全部”就是很好的例子??赡懿皇沁@種情況,但是您可能clean在主目錄中有一個命名的文件。在這種情況下,Make會感到困惑,因為默認情況下clean目標將與此文件關聯,而Make僅在文件的依賴關系似乎不是最新時才運行它。


這些特殊的目標稱為phony,您可以明確地告訴Make與文件無關,例如:


.PHONY: clean

clean:

  rm -rf *.o

make clean即使您有一個名為的文件,Now 也將按預期運行clean。


就Make而言,偽造目標只是一個始終過期的目標,因此,只要您詢問make <phony_target>,它就可以獨立于文件系統的狀態運行。一些常見的make是經常假目標是:all,install,clean,distclean,TAGS,info,check。


查看完整回答
反對 回復 2019-10-23
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

假設您有install目標,這在makefile中很常見。如果使用.PHONY,并且install與Makefile所在的目錄中存在一個名為的文件,make install則將不執行任何操作。這是因為Make將規則解釋為“執行某類配方以創建名為install” 的文件。由于該文件已經存在,并且其依存關系沒有更改,因此不會執行任何操作。

但是,如果將install目標設為PHONY,它將告訴make工具該目標是虛構的,并且該make不應該期望它創建實際的文件。因此,它將不會檢查install文件是否存在,這意味著:a)如果文件確實存在,其行為不會改變; b)stat()不會調用多余的行為。

通常,Makefile中所有不會產生與目標名稱相同名稱的輸出文件的目標都應為PHONY。這通常包括all,install,cleandistclean,等。


查看完整回答
反對 回復 2019-10-23
?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

注意:make工具讀取makefile并檢查規則中':'符號兩側的文件的修改時間戳。


在目錄“測試”中,存在以下文件:


prerit@vvdn105:~/test$ ls

hello  hello.c  makefile

在makefile中,規則定義如下:


hello:hello.c

    cc hello.c -o hello

現在假設文件“ hello”是一個包含一些數據的文本文件,該文件是在“ hello.c”文件之后創建的。因此,“ hello”的修改(或創建)時間戳將比“ hello.c”的時間戳更新。因此,當我們從命令行調用“ make hello”時,它將顯示為:


make: `hello' is up to date.

現在訪問“ hello.c”文件,并在其中添加一些空格,這不會影響代碼語法或邏輯,然后保存并退出?,F在,hello.c的修改時間戳比“ hello”的修改時間戳新?,F在,如果您調用“ make hello”,它將執行以下命令:


cc hello.c -o hello

文件“ hello”(文本文件)將被新的二進制文件“ hello”(上述編譯命令的結果)覆蓋。


如果我們在makefile中使用.PHONY,如下所示:


.PHONY:hello


hello:hello.c

    cc hello.c -o hello

然后調用“ make hello”,它將忽略pwd“ test”中存在的任何文件,并每次執行命令。


現在假設,“ hello”目標沒有聲明依賴項:


hello:

    cc hello.c -o hello

并且pwd“測試”中已經存在“ hello”文件,那么“ make hello”將始終顯示為:


make: `hello' is up to date.


查看完整回答
反對 回復 2019-10-23
  • 3 回答
  • 0 關注
  • 2669 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號