1

即使使用了 -f 标志,当没有要删除的文件时,我的项目中的许多 makefile 之一也会在错误控制台中显示错误。这是makefile中的违规行

-rm -f *.o

如果我删除该行开头的破折号,它会停止在其轨道上 - 所以我知道这是产生错误的行。

这是一个包含十几个 makefile 的大项目。我不明白的是,其他一些人没有这个问题。

这是嵌入式编程世界——我使用的是 WindRiver 2.6(所以 rm 实用程序是“rm.EXE”,虽然它似乎有通常的选项)。

有谁知道如果没有要删除的内容,为什么“rm -f”调用仍会产生错误?

4

2 回答 2

1

make我不熟悉 WindRiver 工具,但这里有一个基于典型 Unix shell 和工具行为的有根据的猜测。

运行rm -f *.o时,会发生以下情况:

  • 外壳尝试扩展*.o,如果没有匹配的文件,则保持原样(尝试echo *.o在不包含此类文件的目录中发出,并在包含此类文件的目录中发出)
  • 扩展的结果被传递给rm,因此如果没有匹配的文件,rm则使用文字字符串*.o作为其参数调用
  • rm将参数解释为路径名,而不扩展模式(因为这是 shell 的工作);-f如果找不到文件,则将其关闭

从错误消息来看,您的设备似乎rm已损坏,因为当找不到调用的文件时它仍然会抱怨*.o。您可以通过首先检查是否有任何文件与该模式匹配来解决此问题。我必须承认,我不知道如何在您的环境中做到这一点。

于 2012-06-15T18:23:07.647 回答
1

在 Windows 环境中,它不能扩展“*.o”并将其按原样发送到rm命令,实际上rm.exe来自cygwin例如,然后失败并出现错误退出代码。rm.exe从 Windows 的命令提示符运行时很难看到,cmd因为它似乎使用相同的参数完成 OK。

解决方案是$(wildcard *.o)在makefile中使用。有“*”很重要,否则即使文件存在也不会扩展任何内容。

因此,make 文件中的行将类似于以下内容:

rm -f $(wildcard *.o) $(wildcard *.elf) $(wildcard *.lst) $(wildcard *.map) $(wildcard *.sym) $(wildcard *.lss) $(wildcard *.eep) $(wildcard *.srec) $(wildcard *.bin) $(wildcard *.hex) $(wildcard *.tmp.sh)
于 2017-11-24T09:52:44.993 回答