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

Posted

技术标签:

【中文标题】Makefile error make (e=2): 系统找不到指定的文件【英文标题】:Makefile error make (e=2): The system cannot find the file specified 【发布时间】:2016-02-13 23:39:30 【问题描述】:

我在 Windows 中使用 makefile 将一些文件推送到 Unix 服务器上(这里是我的 makefile 的同一文件夹中的文本文件“blob.txt”)。 我的 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/

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

【问题讨论】:

make 运行和手动运行时检查PATH(或等效项)的值。我打赌它们在包含pscp 的路径方面有所不同。 这完全正确,解决了问题!如果需要,您可以将其发布为答案! 这也刚刚开始发生在我身上。 make 进程不能再“看到”我系统上的某些文件。我已经用 Chocolatey 安装了 GNU make,它多年来一直运行良好。今天突然之间,bash.exe 和 wsl.exe 等文件在 make 过程中被隐藏了。 【参考方案1】:

错误

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

几乎可以肯定是抱怨 Windows 找不到 pscp

这几乎可以肯定是因为%PATH%(或其他)的值不同当 make 产生一个 shell/console 时然后你手动打开它。

比较这些值以确认这一点。然后在 makefile 配方中使用 pscp 的完整路径,或者确保为 make 的使用正确设置了 PATH 的值。

【讨论】:

arf 很抱歉,但实际上它并没有解决错误......我在我的 makefile 中创建了一个命令@echo $(PATH),它包含 pscp 所在文件夹的路径...... @echo $(PATH) 正在扩展 make PATH 变量的值。尝试改用 shell 路径变量。 @echo $$PATH@echo %PATH% 或其他。【参考方案2】:

我知道这是一个已经回答的老问题,但我想我会和我的经验为任何仍然遇到这个问题的人提供帮助。我得到了同样的神秘错误上校 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”可以完美地工作。

【讨论】:

【参考方案3】:

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

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

如果您对 make 调用的 shell 感到好奇,只需在 makefile 的开头添加 $(info $(SHELL))。运行 make 后,被调用的 shell 的路径/名称会立即打印到控制台。

【讨论】:

我知道我迟到了,但我不得不说,除了 Etan Reisner 之外,Ricardo Alejos 的回答是一个很好的解决方案,如果不是这里的最佳解决方案的话。这是因为如果您通过 git 的东西使用 bash.exe 或某些版本的 bash,您确实应该将所有这些程序(至少是 bin)保留在 PATH 环境变量中。我在 Mac、Linux(debian 发行版)和 windows 10 之间所做的任何事情都没有丢失任何功能。【参考方案4】:

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

【讨论】:

【参考方案5】:

@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.exesh.exe。所以我删除了这个条目,现在它可以正常工作了。

但我仍然不知道为什么 BASH 会参与其中???

添加 1

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

【讨论】:

make 的某些版本会查看您的 SHELL 变量来决定运行哪个 shell。其他人可能有一个sh 兼容的shell 硬编码,以避免Makefiles 对使用有趣的非标准shell 的用户造成破坏。作为记录,你在运行哪个make @tripleee 感谢您的评论。我在 Windows 上使用GNU make 3.81.2520.1772【参考方案6】:

以 user3869623 的响应为基础。

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

虽然此建议可能允许 make 运行,但它可能会导致 git 出现问题,尤其是当 makefile 正在从 git 存储库安装软件时。

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

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

这将隐藏额外的 sh.exe 实例,仅用于该实例。

【讨论】:

以上是关于Makefile error make (e=2): 系统找不到指定的文件的主要内容,如果未能解决你的问题,请参考以下文章

在make 过程中只显示错误信息

mingw32-make.exe: *** [Makefile:175: cmake_check_build_system] Error 1

make: *** 没有指明目标并且找不到 makefile。 停止。

make: *** 没有指明目标并且找不到 makefile. 停止.

make: Warning: File `Makefile' has modification time 1.8e+06 s in the future

Makefile missing separator