我下载了 Ruben 的 构建 Cygwin GCC.
但是运行后似乎无法编译任何文件
$ 触摸 foo.c $ gcc foo.c gcc:错误:spawn:没有这样的文件或目录
作为一种解决方法,我发现这是可行的
i686-w64-mingw32-gcc foo.c
我遇到了同样的问题,并通过除了 gcc-core 之外安装 g++ 包来解决它
我在 Cygwin64 上遇到了同样的问题,解决方案与 PATH 相关..有点。
事实证明, /usr/bin 和 /bin 中有 gcc 的副本(至少在我的安装中有)。
执行 /bin/gcc 失败并出现上述错误——我猜是由于错误地假设了相对路径???
执行 /usr/bin/gcc 可以按预期工作!
就我而言,“问题”是我无意中将“/bin”注入到我的 PATH 环境变量中,导致执行 /bin/gcc,而不是 /usr/bin/gcc。 从路径中删除“/bin”解决了问题。
仍然不清楚为什么在不同的地方有两个 gcc 二进制文件(看起来是相同的)......但也许 Cygwin 大师可以回答这个问题;或者也许我的安装只是 foo-barred。
Ruben 的构建不是 Cygwin GCC 软件包,而是交叉编译器,可以在各种平台上运行,但使用 MinGW-w64 工具链针对本机 Windows。
无论如何,您不应该在 Cygwin 上使用它们。 如果要编译 Cygwin 可执行文件,请安装 gcc4 软件包;如果您想针对 Windows 进行交叉编译,请安装 mingw64-i686-gcc(适用于 Win32)或 mingw64-x86_64-gcc(适用于 Win64)软件包。
strace 显示了 spawn 未找到的文件:
/lib/gcc/x86_64-pc-cygwin/6.4.0/cc1.exe
当我将 cc1.exe 复制到相对于
的位置时
<dir with sh.exe and cpp.exe>/../lib/gcc/x86_64-pc-cygwin/6.4.0/cc1.exe
效果很好。
因此,gcc 试图(某种程度上)告诉您它无法
找到编译器。 我想它需要位于您的路径上或预期的位置。
如果您从 Windows DOS 框执行此操作,那么它肯定需要 Windows PATH 设置。我喜欢
安装 Cygwin,确保包含 rxvt。 这时候你就可以配置纯sh(1)路径了,你的环境就比较文明了
对于那些直接从 Windows shell
在 cygwin 的 bin 中运行内容的人来说,需要注意的一个问题是 Windows 允许您从命令行运行程序,如下所示:
e:cyg/bin/gcc -flags
请注意,
e:
和
cyg
之间没有斜线。因此,此命令将成功从 Windows shell start
cygwin gcc,但在运行中途会出错,因为 gcc
的某些 组件 将利用输入
e:cyg/bin/gcc
的第一个参数,并且与mingw,这不是 cygwin gcc 的有效路径。 只需将命令更改为即可解决此问题:
e:/cyg/bin/gcc -flags
注意
e:
和
cyg
之间的斜杠。类似的问题是由于 Windows 允许像
e:/../folder1
这样的路径作为
e:/folder1
的替代路径。 如果您位于根文件夹并尝试使用 ..
转到向上另一个文件夹,Windows 不会给您错误。因此您可以使用以下命令开始运行
cygwin gcc:
e:/../cyg/bin/gcc -flags
..甚至:
e:/../../../../../../../../../cyg/bin/gcc -flags
但是,它会因
gcc: error: spawn: No such file or directory
而中途失败,因为cygwin gcc的某些
组件会尝试使用命令输入本身的第一个参数来运行
gcc
,并且与mingw不同,e:/../cyg/bin/gcc
不被识别为cygwin 的有效路径,因为当没有文件夹可走时,您要向上文件夹最多。如上所述,可以通过保持路径有效来解决此问题:
e:/cyg/bin/gcc -flags
确保源文件扩展名是小写的(即main.c,
$ gcc -o main main.C
$ gcc: error: spawn: No such file or directory
$ gcc -o main main.c
$ # all good
说明:这是我对 cygwin 和 gcc 的实验,我不知道这种行为的真正原因。