【问题标题】:Issue with dependency files using Makefiles; file.d exist使用 Makefile 的依赖文件问题; file.d 存在
【发布时间】:2022-01-24 18:44:39
【问题描述】:

我有以下用于生成 .d 文件的 makefile 子部分

 -include $(wildcard $(patsubst %,$(OBJ_PATH)/%.d,$(basename $(SRCS))))
 
 
%.o: %.cpp
          @$(CC) -I$(INCLUDE_PATH) $(CFLAGS) $< -MM -MT $(@:.d=.o) > $(OBJ_PATH)/$(notdir $*.d)
          ${CC} -I$(INCLUDE_PATH) $(CFLAGS) -c $< -o $(OBJ_PATH)/$(notdir $@)

有时在我构建项目时,我收到以下错误/bin/sh: /path/to/my/build/dir/file.d: File exists,尽管 .d 文件不存在。

然后我一直收到这个错误,摆脱它的唯一方法是删除整个封闭目录并使用 git restore 并且系统将成功构建。


系统信息:

  • git 版本 2.27.0
  • GNU Make 4.2.1
  • 红帽企业 Linux 8.5 (Ootpa)
  • 免费索引节点:426798634

【问题讨论】:

    标签: linux gcc makefile


    【解决方案1】:

    您应该从创建.d 文件的行中删除@,这样您就可以看到命令行实际上是什么。在您的 makefile 100% 正确工作之前添加 @ 总是一个坏主意。然后,您可以将完整的失败示例剪切并粘贴到您的问题中,包括生成错误消息的命令。

    您的构建线不正确。在编译过程中,您需要使用$@ 而不是$(OBJ_PATH)/$(notdir $@)。构建不完全是 $@ 的文件总是错误的。

    在创建依赖文件期间$(@:.d=.o) 是无用的,因为$@ 已经设置为xxx.o,因此将.d 后缀更改为.o 不会做任何事情。你应该在这里使用-MT $@

    您可以将$(OBJ_PATH)/$(notdir $*.d) 替换为更简单的%*.d

    这个错误是由 shell 显示的,我们真的无法理解给出的信息有什么问题。当你使用“>”覆盖它时,为什么shell会给出“文件存在”错误?

    我怀疑实际上不是这个命令产生了那个错误。

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 1970-01-01
      • 2017-10-03
      • 2013-09-09
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多