2014-09-23 93 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