在我的办公室,我们最近更换了一台笔记本电脑,现在我和我的一位同事在编译代码时遇到了问题。
我们的一个编译工具需要Cygwin 32位版本,我刚安装了一个,我的同事复制并粘贴了他以前笔记本电脑上的那个。我们得到的电脑是64位的,但以前的电脑也是64位的。
我们两个都有makefile返回此错误的问题:
make: "C:cygwinbin"/sh: No such file or directory
make: *** [Makefile:401: clean] Error 127
我们定义";C: \cygwin\bin"正在使用环境变量CYGWIN_BINDIR,我们在makefile中这样调用它:
export CAT = "$(CYGWIN_BINDIR)"/cat
export TOUCH = "$(CYGWIN_BINDIR)"/touch
export SHELL = "$(CYGWIN_BINDIR)"/sh <----Complaining part
export COPY = "$(CYGWIN_BINDIR)"/cp
export PERL = "$(CYGWIN_BINDIR)"/perl
我可以看到sh的二进制文件存在于给定的路径中,我知道我们将反斜杠与正常斜杠混合在一起,但我读到cygwin负责解决这个问题,我们多年来一直在这样编译。
如果我们修改自:
export SHELL = "$(CYGWIN_BINDIR)"/sh
收件人:
export SHELL = sh
现在makefile可以使用二进制文件了,似乎只有sh在抱怨,因为所有其他二进制文件,比如cat/touch/cp/等等。。。正在被makefile正确使用。
你知道我们这里缺少什么吗?
正如我提到的,我们已经用了很多年了。我不知道我们在赛格温的设置中缺少了什么。
这里的问题是make(按照它的工作原理(将双引号作为另一个字符处理,而不是像其他解释器那样扩展它,例如shell解释器。
因此,make试图将SHELL变量设置为包含双引号的路径"C:cygwinbin"/sh
,显然该路径不存在。
请注意,cygwin能够处理反斜杠和普通斜杠,甚至是混合斜杠。
这是使用非常旧版本的cygwin修复的,其中双引号用于解释反斜杠,否则路径"$(CYGWIN_BINDIR)"/s
h(而不是扩展到C:cygwinbin/sh
(将扩展到C:cygwinbin/sh
。
我知道我们本可以修复我们的makefile以使用最新版本的cygwin,但由于这是一个与其他遗留工具链接的遗留项目,我们决定使用旧版本的cygwin。