【问题标题】:Windows Makefile c mkdir -p $@Windows Makefile c mkdir -p $@
【发布时间】:2016-04-04 11:57:27
【问题描述】:

看图,我想在 Windows 10 下的 Makefile 中为 c 项目创建文件夹。在最后一行,我不小心添加了“#”,它可以工作。但是,如果没有最后一行的“#”,它就不起作用。

该行如下:

mkdir -p $@

或

mkdir -p $@ #
  1. 为什么没有“#”就不能工作?
  2. windows 10下如何正确写法?

编辑:简而言之错误消息 错误信息是系统找不到给定的文件(它是一个翻译)

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

【问题讨论】:

  • 请更具体地描述“不起作用”的含义。也就是说,描述预期的行为和实际的行为。另外,请不要将图像用于文本。将文本作为文本直接复制到问题中。
  • mkdir -p 是一个 U*x 命令。除非你有某种 U*x 用户空间(cygwin、Bash 等),否则它根本无法工作,就像 cmd /c start notepad.exe 在非 Windows 平台上不太可能做任何有用的事情。
  • 凯勒姆。它不起作用意味着将其解释为错误并停在那里。
  • 三胞胎,你是对的。 makefile 是来自 Linux 的模板。我试图将它移植到 Windows 环境。但是windows下怎么改写呢。
  • @tripleee 它阅读了手册,它说 mkdir -p 不受支持。但是,windows 的 equilant 是什么?

标签: c windows makefile mkdir


【解决方案1】:

mkdir 不需要-p 参数,所以删除它。它还需要反斜杠而不是斜杠,替换它们。

所以你必须使用的命令而不是你当前的mkdir 是:

    mkdir $(subst /,\,$@)

编辑:

在不太可能的情况下,默认情况下禁用 CMD 命令扩展,您必须改用此命令:

    cmd /E:ON /C mkdir $(subst /,\,$@)

【讨论】:

  • 谢谢,我都试过了。但这些都不起作用!此外,我正在为 i686-w64-mingw32 使用 GNU Make 4.1 构建。
  • @Jay S 你是否收到了诸如gmake: Interrupt/Exception caught (code = 0xc0000005, addr = 0x000007FEFEF82020)之类的有趣错误
  • @Jay 你得到的错误信息是什么?不也是创建一个“#”目录吗?
  • @jdarthenay。不,有额外的#,一切都如我所愿。
  • @Jay 你能检查一下 shell 是 cmd.exe 而不是另一个吗?要了解如何检查 make 使用的 shell,请阅读以下内容:stackoverflow.com/questions/36403389/…
【解决方案2】:

我遇到了完全相同的问题,感谢您的临时解决方案,它最终起作用了。然而,我又挖了一点,至少部分弄清楚了发生了什么。如果你跑

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 输入外壳而不是尝试启动该进程,但是我可以想到三个选项来执行此操作“正确”:

1) 使用一个可执行文件mkdir,就像CoreUtils for Windows 中的那个:http://gnuwin32.sourceforge.net/packages/coreutils.htm。当然,请确保它在您的路径中。

2) 将mkdir 命令更改为cmd /c "mkdir $@",这会将mkdir 提供给Windows 中的本机命令处理程序。就我而言,我不使用-p 标志,因此它与Windows mkdir 兼容,但在您的情况下,本机Windows shell 不支持-p,因此您需要使用更多强大的外壳 (sh) 或参见 #1。

3) 通读make 源代码,看看这种行为是否有某些原因,或者它是否是一个错误。我搜索了手册,我不相信将命令发送到 shell 或将其作为进程打开的性质。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 2020-02-03
    • 2010-10-28
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2014-01-27
    • 2011-12-23
    相关资源
    最近更新 更多