Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 完全相同的命令行在Make中产生错误,但如果从shell运行,则会成功_C_Makefile_Gnu Make - Fatal编程技术网

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

C 完全相同的命令行在Make中产生错误,但如果从shell运行,则会成功,c,makefile,gnu-make,C,Makefile,Gnu Make,我有一个问题,我就是想不起来。我有一个简单的makefile示例,它应该将一个非常简单的.c文件编译成一个可执行程序 当我运行make时,编译器开始编译,然后生成一条错误消息 “T:\printOffsets.c:10:21:错误:bootfc.h:没有这样的文件或 目录“ 然后,我复制了构建目标所使用的完全相同的命令行make,并直接在同一个Windows命令shell实例中运行它,然后突然编译成功,没有错误!!命令行是(路径名简化): T:\perl\c\bin\gcc.exe T:\pri

我有一个问题,我就是想不起来。我有一个简单的makefile示例,它应该将一个非常简单的.c文件编译成一个可执行程序

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

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

然后,我复制了构建目标所使用的完全相同的命令行make,并直接在同一个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:

你能用斜杠代替反斜杠吗?我相信我也遇到过同样的问题,在某些情况下使用斜杠会更好。另外,可能Make没有使用您认为的shell,您可以在makefile中添加一个目标来启动echo$(shell)?@jdarthenay您完全正确!!它使用的是sh.exe,而不是Windows命令shell!将所有反斜杠替换为正斜杠修复了问题!你能发表你的评论作为回答吗?这样我就可以接受/投票了吗?有没有可能将外壳更改为仅用于某个特定make target的配方,但让所有其他目标继续使用默认外壳?antred不知道如何才能做到这一点。也许可以更改
SHELL
的值,但我从未尝试过。@例如,在bash中,您可以使用
cmd/C echo toto
启动单个cmd命令,反之亦然。是的,我就是这么做的。与此同时,我发现还有另一种方法。点击此处,向下滚动至已接受的答案。@非常感谢您的链接,它确实非常有趣。