似乎无法使用GNU Make调用Windows系统命令(例如del,move等)。我正在尝试创建一个不依赖于安装了额外工具(例如来自Cygwin的rm.exe
)的用户的makefile。
运行以下规则时,会报告错误del: command not found
:
clean:
del *.o
这可能是因为没有像“del”这样的可执行文件。我也尝试将其作为cmd
的一个选项运行但是这只会打开一个新提示:
clean:
cmd /C del *.o
我正在使用Windows XP(5.1.2600)和GNU Make 3.79.1捆绑在一起作为MSys的一部分。
答案 0 :(得分:11)
/C
转换似乎需要转义,因为/
被解释为GNU Make中的路径。以下按预期工作:
clean:
cmd //C del *.o
答案 1 :(得分:4)
你在使用Cygwin吗?为什么不拨打rm
?
答案 2 :(得分:3)
del
是cmd.exe
的内置命令(以及之前的command.com
)。您的命令cmd /C del *.o
应该有效,如果它启动一个新的命令提示符,我怀疑cmd可能是一个包装器。您是否尝试使用其完整路径调用cmd(例如c:/WINDOWS/system32/cmd.exe)?
答案 3 :(得分:2)
因为基于DOS的系统有两个不同的命令来删除文件和目录,我发现有两个不同的定义效果最好:
ifeq ($(OS),Windows_NT)
RM = cmd //C del //Q //F
RRM = cmd //C rmdir //Q //S
else
RM = rm -f
RRM = rm -f -r
endif
clean:
$(RM) $(TARGET).elf $(TARGET).map
$(RRM) $(BUILD_DIR)
答案 4 :(得分:1)
也发生在我身上。在makefile的顶部添加:
SHELL=cmd
由于您正在Windows上进行编译,请选择“cmd'作为默认shell。这个 很重要,因为GNU make将搜索linux / unix之类的shell路径,如果找到它,它将使用它。安装cygwin时就是这种情况。这种行为的副作用是像“' del'并且回声'找不到。如果我们告诉GNU make使用' cmd'作为它的外壳,那么' del'这样就可以了。
答案 5 :(得分:0)
Tom Longridge的回答对我来说很接近事实,但是在Windows Vista Business机器上的正斜杠之前使用反斜杠需要完成转义:
RM=cmd \/C del
答案 6 :(得分:0)
另一种解决方案是创建一个包含以下内容的del.bat
文件:
@echo off
del %*
然后makefile
可以只包含
clean:
del *.o
这会清理makefile,但可能会稍微混乱你的构建目录。