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

问题描述 投票:0回答:11

我在 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/

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

windows bash makefile putty pscp
11个回答
23
投票

错误

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
的值。


20
投票

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

<git-installation-directory>/usr/bin
目录也添加到您的 PATH 变量中。这基本上将“GIT bash”附带的其余类似 linux 的命令添加到您的环境中。应用此后,我的 makefile 再次正常运行。 :)

如果您对 make 调用什么 shell 感到好奇,只需在 makefile 的开头添加

$(info $(SHELL))
即可。一旦运行 make,被调用的 shell 的路径/名称就会打印到控制台。


15
投票

我知道这是一个已经得到解答的老问题,但我想我和我的经验对于仍然遇到这个问题的人来说。我遇到了同样的神秘错误 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”,效果非常好。


11
投票

@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 会涉足这个???

添加1

至于为什么

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


9
投票

就我而言,我的

%PATH%
中有 git,其中包含 bash.exe 和 sh.exe。
%GIT_HOME%\bin
中删除
PATH
对我有用。


5
投票

以 user3869623 的 response 为基础:

就我而言,我的

git\bin
中有
%PATH%
,其中包含 bash.exe 和 sh.exe。从
%GIT_HOME%\bin
中删除
PATH
对我有用。

虽然此建议可能允许

make
运行,但它可能会导致 git 出现问题,特别是当 makefile 从 git 存储库安装软件时。

更好的解决方案是简单地将

%GIT_HOME%\bin
更改为
%GIT_HOME%\cmd


1
投票

我在 Windows 上。
通过显式地将我的编译器设置为

gcc
(而不是
cl
?),它解决了我的问题。

CC = gcc

我希望一些比我更有知识的人可以解释为什么更改编译器会影响makefile解析。


0
投票

对于那些尝试从

PATH
中删除 git bin 文件夹但不起作用的人,请在
PATH
变量中搜索包含
bash.exe
的任何路径。

在我的例子中,我发现一个链接到 cygwin bin 文件夹的变量

C:\cygwin64\bin
,删除它并且它起作用了。


0
投票

我遇到了同样的问题,这个帖子确实帮助我解决了它。就我而言,由于 git 和 mingw64 的原因,在我的路径中可以看到 make 和 sh.exe 之间存在冲突。为了在不破坏 Git 的情况下解决我的问题,我将这些行添加到调用 make 的批处理文件的顶部:

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

这会仅针对该实例隐藏额外的 sh.exe 实例。


0
投票

我最近遇到了这个问题,这个问题是我搜索的热门问题之一。

这里的其他答案都没有帮助我。对我来说,解决方法是将二进制名称放在引号中:

setup:
        "pscp" blob.txt username@hostname:/folder/
        -"pscp" blob.txt username@hostname:/folder/ # Failure is OK, `-` in front

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.