Makefile错误make(e = 2):系统找不到指定的文件

时间:2015-11-12 15:23:05

标签: windows bash makefile putty pscp

我在Windows中使用makefile来推送Unix服务器上的一些文件(这里是一个文本文件" blob.txt"在我的makefile的同一个文件夹中)。 我的makefile脚本是:

setup:
        pscp blob.txt username@hostname:/folder/

我启动命令提示符,进入blob.txt和makefile所在的文件夹并输入:

make setup

结果是:

pscp blob.txt username@hostname:/folder/
process_begin: CreateProcess(NULL, pscp blob.txt username@hostname:/folder/, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [setup] Error 2

在#fail中......如果我在命令提示符中直接输入命令:

pscp blob.txt username@hostname:/folder/

它有效......我真的很想知道为什么。

8 个答案:

答案 0 :(得分:12)

错误

process_begin: CreateProcess(NULL, pscp blob.txt username@hostname:/folder/, ...) failed.
make (e=2): The system cannot find the file specified.

几乎肯定抱怨Windows无法找到pscp

这几乎可以肯定是因为当make生成shell /控制台然后手动打开时,%PATH%(或其他)的值不同

比较值以确认。然后使用makefile配方中pscp的完整路径,或者确保PATH的值已正确设置{/ 1}}。

答案 1 :(得分:6)

在我的情况下,我的%PATH%中有git \ bin,其中包含bash.exe和sh.exe ..从%GIT_HOME%\bin删除PATH为我工作

答案 2 :(得分:5)

@ user3869623的解决方案适合我。我想分享一些我的细节来完成图片。

我的makefile包含以下目标:

clean:
    @echo '$(OS)'
ifeq ($(OS),Windows_NT)
    del /s *.o *.d *.elf *.map *.log
endif

当我运行make clean时,我看到了这个错误:

enter image description here

因为它说echo出了问题,所以我将makefile目标改为:

clean:

ifeq ($(OS),Windows_NT)
    del /s *.o *.d *.elf *.map *.log
endif

这一次,make clean给了我这个错误:

enter image description here

我很惊讶地看到bash,因为我在Windows命令行中工作。

然后我检查了我的%PATH%,我看到了这个条目:

C:\DevTools\Git\bin

该路径中有bash.exesh.exe。所以我删除了这个条目,现在工作正常。

但我仍然不知道为什么BASH会进入这个???

ADD 1

至于为什么C:\DevTools\Git\bin出现在%PATH%中,因为我使用的是Sublime,它总是要求我提供Git二进制文件:

enter image description here

答案 3 :(得分:4)

我知道这是一个已经回答过的老问题,但我想我和我的经历对任何人来说仍然存在。我得到了相同的神秘错误上校Beauvel(虽然使用了Windows MOVE命令,而不是pscp):

process_begin: CreateProcess(NULL, move /y foo\bar.c .\baz.c, ...) failed.
make (e=2): The system cannot find the file specified.

我们的CI运行相同的Makefile并且运行良好。原来CI正在使用mingw32-make而我正在使用GNU make。卸载GNU make(作为不相关的批量包的一部分安装)和别名mingw32-make到'make'可以很好地工作。

答案 4 :(得分:2)

以user3869623的响应为基础。

  

在我的情况下,我的%PATH%中包含git \ bin,其中包含bash.exe和sh.exe。从路径中删除%GIT_HOME%\ bin对我有用

尽管此建议可能允许make运行,但可能会导致git出现问题,尤其是在makefile从git存储库中安装软件的情况下。

更好的解决方案是将%GIT_HOME%\bin更改为%GIT_HOME%\cmd

答案 5 :(得分:1)

我不想从PATH变量中删除GIT的bin文件夹(我使用的是Windows机器),因为我经常使用它。所以我找了一个解决方法。这是:

public class Customer: ICustomer{ public Customer(Details details){ Details = details; } [JsonProperty("Details",NullValueHnadling = NullValueHandling.Ignore)] public IDetails Details {get; set;} } 目录添加到PATH变量中。这基本上将“GIT bash”附带的其他类似linux的命令添加到您的环境中。应用此功能后,我的makefile再次正常运行。 :)

如果您对make调用的shell感到好奇,只需在makefile的开头添加<git-installation-directory>/usr/bin即可。一旦运行make,就会将调用的shell的路径/名称打印到控制台。

答案 6 :(得分:0)

对于那些尝试从PATH删除git bin文件夹并且它不适用于他们的人,请在PATH变量中搜索包含bash.exe的任何路径。

在我的情况下,我发现了一个链接到cygwin bin文件夹C:\cygwin64\bin的变量,将其删除并且有效。

答案 7 :(得分:0)

我遇到了同样的问题,这个线程确实帮助我解决了这个问题。在我的情况下,由于git和mingw64,这是make和sh.exe之间的冲突,该冲突通过我的路径可见。为了解决我的问题,在不破坏Git的情况下,我将以下行添加到了调用make的批处理文件的顶部:

set path=%path:git\bin=;%
set path=%path:mingw64\bin=;%
set path=%path:usr\bin=;%

这仅对make实例隐藏了exstra sh.exe实例。