2014-09-23 46 views
1

我有一種情況,我重構了一些代碼,並移動了一個包含文件。make:依賴項丟失時無效的目標文件

試圖構建源樹產生一個錯誤:

make: *** No rule to make target `cmd/dispatcher.h', \ 
    needed by `/tmp/test/dispatcher/main.o'. Stop. 

如果我做了make clean(刪除過時的main.o文件),然後重建我得到一個不同的錯誤:

...src/test/dispatcher/main.cpp:3:28: fatal error: cmd/dispatcher.h: \ 
    No such file or directory 

問題:

有什麼辦法可以使無效10當其中一個依賴關係丟失?

+0

我不這麼認爲。但是你可以告訴makefile始終在這樣的情況下進行構建 - 使用標誌使 – 2014-09-23 07:38:19

+0

構建中不再需要'main.o'? – Beta 2014-09-23 11:24:53

+0

@SagarSakre我想避免這種情況 - 讓'main.o'實現依賴''cmd/dispatcher.h'丟失會導致'main.cpp'重建而不重建世界其他地方 – 2014-09-23 23:20:33

回答

1

make沒有魔法。如果main.o取決於dispatcher.h,那麼它寫在某處。

我懷疑你的Makefile運行gcc-MD-MDD選項創建一個依賴文件。通常它們以.d後綴命名。這些依賴關係文件由gcc自動創建爲Makefile內容:target: dependencies

然後將這些文件包含在主要的Makefile中以提供完整的自動相關性。

您應該查找這些.d文件並將其刪除。

+0

'deps:= $(subst $(OBJ_DIR),$( DEP_DIR),$(subst .o,.d,$(OBJECTS))) -include $(deps)' – 2014-09-23 23:22:02

+0

抱歉 - 按回車太快......我的依賴關係自動生成如下:'deps:= $( subst $(OBJ_DIR),$(DEP_DIR),$(subst .o,.d,$(OBJECTS))) -include $(deps)'。你說得對,舊文件列在'.d'文件中,我想我正在尋找一種方法讓'.d'文件無效並因此重建 – 2014-09-23 23:37:09

+1

@SteveLorimer如果你的問題是由過時的gcc引起的自動刪除附加的「-MP」選項應該可以幫助你下次避免這種情況。 – user657267 2014-09-24 08:56:25