我一直在使用Cygwin(很长一段时间)。具体来说,我在 Win7 上使用它(包括 gcc/g++)进行开发工作。我最近才注意到现在存在64 位版本。
我没有需要转换到 64 位的特定需求,但我想知道是否要这样做。可取吗?优缺点都有什么?过渡时是否存在已知的过弧问题?
曾几何时,64 位 Cygwin 缺少许多存在于 32 位 Cygwin 中的软件包,但如今此类软件包的列表非常短。由于这是在 64 位 Windows 系统上创建新的 32 位 Cygwin 安装的最后一个重要原因,因此您今天不太可能有充分的理由这样做。
使用 64 位 Cygwin 的最大优势是可以访问更多的内存。优势有两种截然不同的表现方式:
许多 Cygwin 程序将尽可能多地使用 RAM。
例如,如果您将 Cygwin 版本的R用于大型数据集,则应尽快切换到 64 位 Cygwin,因为 R 要将整个数据集加载到 RAM 中,因此在 64 位上使用 32 位 Cygwin machine 人为地限制了 R 在 Cygwin 下可以完成的工作。
Cygwin 在面对调用时处理 DLL 的方式fork()
要求将它们加载到固定的内存地址。
(这是rebase
机制,通常在 Cygwin 的每次运行结束时自动运行setup.exe
。)
这样做的一个后果是,在 32 位 Cygwin 中可以安装如此多的包,这些包rebase
用尽了地址空间,试图为它们提供所有唯一的加载地址。出于所有实际目的,64 位地址空间的指数级大小现在消除了这种可能性。
在某些情况下,64 位 Cygwin 也可以更快一些。
您可以同时安装和运行这两个版本的 Cygwin。您甚至可以同时为每个 up 设置一个 MinTTY 窗口。尽管如此,最好将它们视为独立的世界,因为这两个 Cygwins从根本上是不相容的。如果你试图让它们互操作,你会遇到麻烦。
这种根本的不兼容性可能会以多种方式影响您:
尽管 64 位 Cygwin 程序可以启动 32 位 Cygwin 程序,反之亦然,但一些跨进程机制无法跨越该边界:POSIX 共享内存、文件句柄传递getppid(2)
……
当您尝试使两个不同的 Cygwin 互操作时,即使某些您不认为是跨进程的事情也会失败。例如, Cygwin 的大部分内容/proc
来自 DLL,因此两个 Cygwin 之间的内容会有所不同,即使它们同时在同一台机器上运行。
假设您想/usr/local
在 Cygwin 之间共享,因此您不必拥有从源代码构建的所有软件的两个副本。
在阅读了上面的第一项之后,您意识到您无法共享/usr/local/bin
或/usr/local/lib
。
在考虑之后,您决定只想共享/usr/local/src
,这样您至少不必拥有重复的源代码树。如果您在源代码树中构建任何这些程序,您仍然会遇到问题,这是典型的。(即./configure && make && make install
)
发生这种情况有两个原因:
生成的二进制文件 ( *.o
, *.so
, *.a
, *.exe
...) 在两个 Cygwin 之间将不兼容,因此除非您make clean
在 Cygwin 之间切换时,否则它们将被抛在后面,造成混乱。
即使您记得make clean
,每个 Cygwin 下的输出./configure
也可能不同,因此尝试在 64 位 Cygwin 下构建一个在 32 位 Cygwin 下配置的程序(反之亦然)可能会失败。
有几种方法可以摆脱这个陷阱:
也放弃分享/usr/local/src
。
请记住,make clean && ./configure
每当您切换 Cygwins 时。
为每个 Cygwin 变体分别构建树外构建。
这比前一个选项更干净、更快、更可靠,但并非所有源代码树都设置为允许这样做。
如果您没有充分的理由忍受此类问题,请安装一个版本或另一个版本,而不是同时安装两者。
如果您有一个正常运行的 32 位 Cygwin 设置并且不需要 64 位 Cygwin 的好处,那么您不必觉得必须用 64 位安装来替换它。32 位 Cygwin 不会很快消失。
同时,如果我要设置一个新的 64 位 Windows 机器,我会在其上安装 64 位 Cygwin,除非我事先知道它没有移植我需要的包,而且我没有愿意自己做港口。它是稳定的并且大部分是完整的。
作为Cygwin 1.7.25 发行说明的一部分, Cygwin的联合首席开发人员 Corinna Vinschen说过以下内容:
关于 64 位版本
这只是第四个正式的 Cygwin 版本,它作为 AMD64 Windows 系统的 64 位版本公开可用,所以它仍然很新。
现在 64 位 Cygwin 发行版没有像 32 位版本那样多的软件包,但它和 32 位版本一样稳定,并且随着时间的推移会有更多的软件包可用。
如果您已经在 64 位 Windows 机器上运行 32 位版本的 Cygwin,您可以继续这样做。如果您计划在 64 位 Windows 机器上安装新的 Cygwin,请考虑使用新的 64 位 Cygwin 版本,除非您需要 64 位版本中尚不可用的某些软件包。
“升级”到 64 位的另一个问题是,AFAIK 没有一种方法可以自动重新安装与 32 位安装相同的软件包列表,因此您将不得不煞费苦心地制作一个列表已安装的软件包,并在新安装中煞费苦心地检查它们,只是为了回到重新安装之前的位置。
Cygwin x64 有一些很大的优势。其中之一是更好的内存管理。我尝试了很多address already in use
,或者fork: retry: Resource temporarily unavailable
这迫使我rebaseall
每天运行几次。
使用 Cygwin x64 我从来没有遇到过这样的问题。
安装两者。它不需要太多时间或磁盘空间,并且某些软件包不适用于 cygwin64。(将它们放在不同的目录中!)
我不知道 cygwin64 中的 sqlite3 是否可以索引大小超过 4G 的数据库,但我知道 cygwin32 中的 sqlite3 不能,而 64 位 Linux 中的 sqlite3 可以。
cygwin64 仍然没有 pdftk(PDF 工具包)。
没有足够的声誉来评论所选答案,所以这里是:
在 (via)中安装 Cygwin64 怎么样,在c:\cygwin
(via )setup-x86_64.exe
中安装辅助 Cygwin32 ,然后在 $PATH 末尾添加?c:\cygwin32
setup-x86.exe
/cygdrive/c/cygwin32/<for_each_of_the_bin_dirs>
这应该默认运行 64 位应用程序,但如果 64 位版本不存在,则允许调用 32 位应用程序。
如果setup-x86_64.exe
能够提供所有 Cygwin 应用程序的版本感知统一列表,并且仅在需要时执行 32 位安装(弹出建议执行 64 位端口),这将很有用。