【问题标题】:Exact same command line produces error in Make yet succeeds if run from shell如果从 shell 运行,完全相同的命令行会在 Make 中产生错误但会成功
【发布时间】:2016-04-04 12:58:46
【问题描述】:

我有一个无法解决的问题。我有一个最小的示例 makefile,它应该将一个非常简单的 .c 文件编译成可执行程序。

当我运行 ma​​ke 时,编译器开始编译,然后产生错误消息

"T:\printOffsets.c:10:21: 错误: bootIfc.h: 没有这样的文件或 目录”

然后我复制完全相同的命令行 ma​​ke 用于构建目标并直接在同一个 Windows 命令 shell 实例中运行它,突然编译成功而没有错误!命令行是(简化的路径名):

T:\perl\c\bin\gcc.exe T:\printOffsets.c -IT:\include\ -o D:\printOffsets.exe

我怎么知道?好吧,ma​​ke 会在执行命令行之前打印它,所以我只需从 shell 复制和粘贴。

我不明白!这怎么可能??如果从 Makefile 中启动,完全相同的命令如何在 shell 上运行并失败??

顺便说一下,我在 Windows 7 上使用 GNU Make 3.82。

【问题讨论】:

  • 您可以尝试使用斜杠而不是反斜杠吗?我相信我有时会遇到同样的问题,在某些情况下使用斜杠会更好。
  • 另外,也许 Make 没有使用你认为的 shell,你可以在你的 makefile 中添加一个目标来启动 echo $(SHELL) 吗?
  • @jdarthenay 你完全正确!!它使用的是 sh.exe,而不是 Windows 命令外壳!并用正斜杠替换所有反斜杠解决了这个问题!您能否发表您的评论作为答案,以便我接受/投票?

标签: c makefile gnu-make


【解决方案1】:

当 makefile 中的命令与 shell 给出不同的结果时,只需确保它使用的是你想要的 shell。

在你的 make 文件中添加一个虚假目标:

.PHONY:testshell

testshell:
    echo $(SHELL)

然后运行:

gmake testshell

如果结果不是你最喜欢的 shell,你可以通过在你的 makefile 开头添加一行这样的行来强制它:

SHELL=C:\Windows\System32\cmd.exe

如果您不确定 shell 的完整路径,只需打开 DOS 控制台并启动:

where cmd

编辑:替代解决方案

当使用sh shell 代替cmd shell 时,您还可以将命令中的所有反斜杠替换为斜杠并继续使用sh

编辑 2:change shell for a single target

【讨论】:

  • 是否可以将 shell 更改为仅用于一个特定 make 目标的配方,但让所有其他目标继续使用默认 shell?
  • @antred 不知道一个人怎么能做到这一点。也许可以更改SHELL 的值,但我从未尝试过。
  • @antred 也许你可以从 bash 启动单个 cmd 命令,例如 cmd /C echo toto,反之亦然。
  • 是的,这就是我最终所做的。与此同时,我发现还有另一种方法。转到此处stackoverflow.com/questions/589276/… 并向下滚动到接受的答案。
  • @antred 感谢这个链接,确实很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多