60

我一直在使用Cygwin(很长一段时间)。具体来说,我在 Win7 上使用它(包括 gcc/g++)进行开发工作。我最近才注意到现在存在64 位版本

我没有需要转换到 64 位的特定需求,但我想知道是否要这样做。可取吗?优缺点都有什么?过渡时是否存在已知的过弧问题?

4

6 回答 6

91

曾几何时,64 位 Cygwin 缺少许多存在于 32 位 Cygwin 中的软件包,但如今此类软件包的列表非常短。由于这是在 64 位 Windows 系统上创建新的 32 位 Cygwin 安装的最后一个重要原因,因此您今天不太可能有充分的理由这样做。

使用 64 位 Cygwin 的最大优势是可以访问更多的内存。优势有两种截然不同的表现方式:

  1. 许多 Cygwin 程序将尽可能多地使用 RAM。

    例如,如果您将 Cygwin 版本的R用于大型数据集,则应尽快切换到 64 位 Cygwin,因为 R 要将整个数据集加载到 RAM 中,因此在 64 位上使用 32 位 Cygwin machine 人为地限制了 R 在 Cygwin 下可以完成的工作。

  2. Cygwin 在面对调用时处理 DLL 的方式fork()要求将它们加载到固定的内存地址。

    (这是rebase机制,通常在 Cygwin 的每次运行结束时自动运行setup.exe。)

    这样做的一个后果是,在 32 位 Cygwin 中可以安装如此多的包,这些包rebase用尽了地址空间,试图为它们提供所有唯一的加载地址。出于所有实际目的,64 位地址空间的指数级大小现在消除了这种可能性。

在某些情况下,64 位 Cygwin 也可以更快一些。

您可以同时安装和运行这两个版本的 Cygwin。您甚至可以同时为每个 up 设置一个 MinTTY 窗口。尽管如此,最好将它们视为独立的世界,因为这两个 Cygwins从根本上是不相容的。如果你试图让它们互操作,你会遇到麻烦。

这种根本的不兼容性可能会以多种方式影响您:

  1. 尽管 64 位 Cygwin 程序可以启动 32 位 Cygwin 程序,反之亦然,但一些跨进程机制无法跨越该边界:POSIX 共享内存、文件句柄传递getppid(2)……

  2. 当您尝试使两个不同的 Cygwin 互操作时,即使某些您不认为是跨进程的事情也会失败。例如, Cygwin 的大部分内容/proc来自 DLL,因此两个 Cygwin 之间的内容会有所不同,即使它们同时在同一台机器上运行。

  3. 假设您想/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,除非我事先知道它没有移植我需要的包,而且我没有愿意自己做港口。它是稳定的并且大部分是完整的。

于 2013-08-20T10:45:25.643 回答
8

作为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 位版本中尚不可用的某些软件包。

于 2013-11-11T06:32:41.913 回答
5

“升级”到 64 位的另一个问题是,AFAIK 没有一种方法可以自动重新安装与 32 位安装相同的软件包列表,因此您将不得不煞费苦心地制作一个列表已安装的软件包,并在新安装中煞费苦心地检查它们,只是为了回到重新安装之前的位置。

于 2014-01-16T16:38:06.823 回答
3

Cygwin x64 有一些很大的优势。其中之一是更好的内存管理。我尝试了很多address already in use,或者fork: retry: Resource temporarily unavailable这迫使我rebaseall每天运行几次。

使用 Cygwin x64 我从来没有遇到过这样的问题。

于 2015-11-11T20:03:47.627 回答
1

安装两者。它不需要太多时间或磁盘空间,并且某些软件包不适用于 cygwin64。(将它们放在不同的目录中!)

我不知道 cygwin64 中的 sqlite3 是否可以索引大小超过 4G 的数据库,但我知道 cygwin32 中的 sqlite3 不能,而 64 位 Linux 中的 sqlite3 可以。

cygwin64 仍然没有 pdftk(PDF 工具包)。

于 2013-10-20T00:33:17.923 回答
0

没有足够的声誉来评论所选答案,所以这里是:

在 (via)中安装 Cygwin64 怎么样,在c:\cygwin(via )setup-x86_64.exe中安装辅助 Cygwin32 ,然后在 $PATH 末尾添加?c:\cygwin32setup-x86.exe/cygdrive/c/cygwin32/<for_each_of_the_bin_dirs>

这应该默认运行 64 位应用程序,但如果 64 位版本不存在,则允许调用 32 位应用程序。

如果setup-x86_64.exe能够提供所有 Cygwin 应用程序的版本感知统一列表,并且仅在需要时执行 32 位安装(弹出建议执行 64 位端口),这将很有用。

于 2014-12-19T18:41:07.127 回答