我在 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/
它有效......我真的很想知道为什么。
错误
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
的使用正确设置 make
的值。
我不想从 PATH 变量中删除 GIT 的 bin 文件夹(我使用的是 Windows 机器),因为我经常使用它。所以我寻找一种解决方法,这就是:
将
<git-installation-directory>/usr/bin
目录也添加到您的 PATH 变量中。这基本上将“GIT bash”附带的其余类似 linux 的命令添加到您的环境中。应用此后,我的 makefile 再次正常运行。 :)
如果您对 make 调用什么 shell 感到好奇,只需在 makefile 的开头添加
$(info $(SHELL))
即可。一旦运行 make,被调用的 shell 的路径/名称就会打印到控制台。
我知道这是一个已经得到解答的老问题,但我想我和我的经验对于仍然遇到这个问题的人来说。我遇到了同样的神秘错误 Colonel 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”,效果非常好。
@user3869623 的解决方案对我有用。我想分享一些我的细节来完成这幅画。
我的 makefile 包含以下目标:
clean:
@echo '$(OS)'
ifeq ($(OS),Windows_NT)
del /s *.o *.d *.elf *.map *.log
endif
当我运行
make clean
时,我看到此错误:
因为它说
echo
出了问题,所以我将 makefile 目标更改为以下:
clean:
ifeq ($(OS),Windows_NT)
del /s *.o *.d *.elf *.map *.log
endif
这次,
make clean
给了我这个错误:
我很惊讶在这里看到
bash
,因为我正在 Windows 命令行中工作。
然后我检查了我的
%PATH%
,我看到了这个条目:
C:\DevTools\Git\bin
该路径中有一个
bash.exe
和 sh.exe
。所以我删除了这个条目,现在工作正常了。
但我还是不知道为什么 BASH 会涉足这个???
至于为什么
C:\DevTools\Git\bin
出现在我的%PATH%
中,因为我使用的是Sublime,它总是要求我提供Git二进制文件:
就我而言,我的
%PATH%
中有 git,其中包含 bash.exe 和 sh.exe。%GIT_HOME%\bin
中删除 PATH
对我有用。
以 user3869623 的 response 为基础:
就我而言,我的
中有git\bin
,其中包含 bash.exe 和 sh.exe。从%PATH%
中删除%GIT_HOME%\bin
对我有用。PATH
虽然此建议可能允许
make
运行,但它可能会导致 git 出现问题,特别是当 makefile 从 git 存储库安装软件时。
更好的解决方案是简单地将
%GIT_HOME%\bin
更改为 %GIT_HOME%\cmd
。
我在 Windows 上。
通过显式地将我的编译器设置为
gcc
(而不是 cl
?),它解决了我的问题。
CC = gcc
我希望一些比我更有知识的人可以解释为什么更改编译器会影响makefile解析。
对于那些尝试从
PATH
中删除 git bin 文件夹但不起作用的人,请在 PATH
变量中搜索包含 bash.exe
的任何路径。
在我的例子中,我发现一个链接到 cygwin bin 文件夹的变量
C:\cygwin64\bin
,删除它并且它起作用了。
我遇到了同样的问题,这个帖子确实帮助我解决了它。就我而言,由于 git 和 mingw64 的原因,在我的路径中可以看到 make 和 sh.exe 之间存在冲突。为了在不破坏 Git 的情况下解决我的问题,我将这些行添加到调用 make 的批处理文件的顶部:
set path=%path:git\bin=;%
set path=%path:mingw64\bin=;%
set path=%path:usr\bin=;%
这会仅针对该实例隐藏额外的 sh.exe 实例。
我最近遇到了这个问题,这个问题是我搜索的热门问题之一。
这里的其他答案都没有帮助我。对我来说,解决方法是将二进制名称放在引号中:
setup:
"pscp" blob.txt username@hostname:/folder/
-"pscp" blob.txt username@hostname:/folder/ # Failure is OK, `-` in front
Windows 23H2(操作系统内部版本 22631.3085)
Git Bash 2.43.0(mintty 3.7.0(x86_64-pc-msys))
制作3.81(i386-pc-mingw32)
经过多次试验,对我有用的是使用
${CURDIR}
env 而不是 $(shell pwd)
## this does not work
# export PROJ_ROOT := $(shell pwd)
## this worked but it is too much
# export PROJ_ROOT := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
## this worked!
export PROJ_ROOT := ${CURDIR}
另外,仔细检查你的环境变量,你应该有:
C:\Program Files\Git\bin
C:\Program Files\Git\usr\bin
C:\Program Files (x86)\GnuWin32\bin