查看图片,我想在Windows 10下的c项目的Makefile中创建文件夹。在最后一行,我不小心添加了#34;#",它有效。但是,没有"#"它就无法工作。在最后一行。
该行如下:
mkdir -p $@
或
mkdir -p $@ #
编辑:错误消息简而言之 错误信息是系统无法找到给定的文件(它是翻译)
making dirs....
build/
mkdir -p build/
Makefile:293: recipe for target 'build/' failed
process_begin: CreateProcess(NULL, mkdir -p build/, ...) failed.
make (e=2): Das System kann die angegebene Datei nicht finden.
make: *** [build/] Error 2
编辑:我在文本中添加代码如下
#Create non existing dirs
OBJDIRS = $(sort $(dir $(OBJS))) #sort removes duplicate dirs...
$(OBJDIRS):
@echo
@echo "making dirs...."
@echo $@
mkdir -p $@ #ok
答案 0 :(得分:1)
mkdir
不需要-p
参数,因此请将其删除。它还需要反斜杠而不是斜线,替换它们。
因此,您必须使用的命令代替当前的mkdir
:
mkdir $(subst /,\,$@)
编辑:
在不太可能的情况下,默认情况下禁用CMD Command Extensions,您必须改为使用此命令:
cmd /E:ON /C mkdir $(subst /,\,$@)
答案 1 :(得分:0)
我有完全相同的问题,并感谢您的临时解决方案,它最终工作。然而,我挖了一点,至少部分地想出了发生了什么。如果你运行
make --debug=j
当您添加#
字符时,您会看到make
实际运行
mkdir _build #
CreateProcess(NULL,C:/Program Files/GNU ARM Eclipse/Build Tools/2.6-201507152002/bin/sh.exe -c "mkdir _build #",...)
实际上只有这样才有意义,因为mkdir
不是Windows中的实际可执行文件,而是仅在Windows shell中解释的命令。我做了一些挖掘make
(对于Win32)源代码,看起来似乎有相当多的硬编码逻辑用于决定通过sh
提供哪些命令以及哪些命令尝试作为一个过程启动。我还没弄清楚哪个用例导致#
符号突然决定将mkdir
提供给shell而不是尝试启动该过程,但是你有三个选项我可以想到这样做"正确":
1)使用可执行文件mkdir
,类似于CoreUtils for Windows中的文件:here。当然,请确保它在你的道路上。
2)将mkdir
命令更改为cmd /c "mkdir $@"
,这会将mkdir
提供给Windows中的本机命令处理程序。在我的情况下,我不使用-p
标记,因此它与Windows mkdir
兼容,但在您的情况下,本机Windows shell不支持-p
,所以你需要使用更强大的shell(sh
)或参见#1。
3)仔细阅读make
源代码,看看是否存在这种行为的原因,或者是否是一个错误。我搜索了手册,我不相信将命令发送到shell或打开它作为一个过程的性质。