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.exe
和 sh.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): 系统找不到指定的文件的主要内容,如果未能解决你的问题,请参考以下文章
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