如果从shell运行,则完全相同的命令行会在Make中生成错误但仍然成功

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

当我运行make时 ,编译器开始编译然后生成错误消息

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

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

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

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

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

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

当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: 更改单个目标的shell