2014-09-02 56 views
2

通過MakeFiles時,我發現當命名爲目標的文件即使不使用.PHONY時也存在,目標正在建立。 但是,當我對另一個目標進行相同的處理時,即清理時,目標沒有建立起來,並說「清理是最新的」,這是可以的。 我只想知道當文件存在於當前目錄時爲什麼另一個目標正在建立。如果在當前目錄中已經存在名爲目標的文件時沒有.PHONY目標

生成文件:

CC:= gcc 
CCFLAGS:=-Wall -Wextra 
hello: hellomake.o hellofunc.o 
     $(CC) $(CCFLAGS) hellomake.c hellofunc.c -o file 
hellomake.o : hellomake.c 
     $(CC) $(CCFLAGS) -c hellomake.c 
hellofunc.o : hellofunc.c 
     $(CC) $(CCFLAGS) -c hellofunc.c 
clean: 
     rm -rf *.o 
     rm -rf file 

我的當前目錄下的文件已命名相同的目標,如 「你好」。 它應該給結果爲「你好達最新的」,但它沒有這樣做,並給輸出: 讓你好

gcc -Wall -Wextra hellomake.c hellofunc.c -o file 

請告訴這是爲什麼構建目標時目標不.phony和作爲目標命名的文件已經存在於當前目錄中。

+1

如果'hellomake.c'或'hellofunc.c'比最新'hello'它會重建。運行'make hello'兩次,你可以在第二次看到它會給你好是uptodate – 2014-09-02 08:41:20

+1

'我只是想知道爲什麼當文件存在於當前目錄時,其他目標正在建立'你應該檢查目標是否重建即使依賴關係沒有被修改。 – 2014-09-02 08:42:50

+0

創建了我在makefile中使用的文件後,我在我的目錄中創建了「hello」文件。但即使沒有.PHONY,makefile也不會給出任何錯誤。通常,當與目標名稱相同的文件存在於當前目錄中時,它不應該運行目標的命令,不使用.PHONY,但在我的情況下,它是這樣做的。 :) – Mayank 2014-09-02 12:50:17

回答

3

因爲make查看上次修改時間來決定要構建的內容。從make manual

make程序使用makefile文件數據庫和文件的最後修改時間來決定哪些文件需要更新。

命令make檢查目標及其先決條件之間的時間關係。如果先決條件已在目標後被修改,則意味着目標已過期,即使文件存在,也會觸發重建。所以很可能你的依賴關係在目標之後被修改了。

爲了避免這種情況,您可以:

  • 使用touch更改目標時間戳。
  • 在調用make hello之前使用make -t hellomake --touch hello。從docs
‘-t’ 
‘--touch’ 
Marks targets as up to date without actually changing them. In other words, 
make pretends to update the targets but does not really change their 
contents; instead only their modified times are updated. 
+0

避免這種行爲的最好方法是簡單地使用配方創建的文件的名稱作爲目標,這是make如何工作的。所以如果你的配方建立一個名爲'file'的文件,就像上面的配方('gcc ... -o file')一樣,那麼目標名稱應該是'file',而不是'hello'。然後它將按預期工作。 – MadScientist 2014-09-02 11:44:03

相關問題