从Cygwin 32bit切换到Cygwin 64bit是否明智?

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

我没有具体的需要,我需要转换到64位,但我想知道是否要这样做。 这是可取的吗? 优缺点都有什么? 在转换过程中是否存在过度的问题?

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

使用64位Cygwin的最大好处是可以访问更多的内存。 有两种截然不同的方式来performance自己的优势:

  1. 许多Cygwin程序将使用尽可能多的RAM,你可以给他们。

    例如,如果你使用的Cygwin版本的R与大数据集,你应该切换到64位Cygwin ASAP,因为R想要加载到RAM的整个数据集,所以使用64位的32位Cygwin机器人为地限制了R可以在Cygwin下完成的工作。

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

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

    这样做的一个结果就是,在32位的Cygwin中可能会安装这么多的软件包,使地址空间不足,试图给他们所有唯一的加载地址。 对于所有的实际目的,64位地址空间的指数级更大的大小现在消除了这种可能性。

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

你可以同时安装和运行两个版本的Cygwin。 您甚至可以同时为每个提供一个MinTTY窗口。 尽pipe如此,最好将它们作为独立的世界来对待,因为两个Cygwins基本上是不相容的 。 如果您尝试让它们互操作,您将遇到麻烦。

这种根本性的不兼容性可能会以多种方式咬你:

  1. 即使一个64位的Cygwin程序可以启动一个32位的Cygwin程序,反之亦然,几个跨进程机制将无法跨越这个边界:POSIX共享内存,文件句柄传递, getppid(2)

  2. 即使有些事情你不认为是跨进程将会失败,当你试图使两个不同的Cygwins互操作。 Cygwin的/proc大部分内容都来自于DLL内部,所以它们在两个Cygwins之间是不同的,即使它们在同一台机器上同时运行。

  3. 假设你想在Cygwins之间共享/usr/local ,所以你不需要从源代码中创build所有软件的两个副本。

    读完上面的第一项后,您会意识到不能共享/usr/local/bin/usr/local/lib

    思考完之后,你决定只是想共享/usr/local/src这样你至less不必拥有重复的源代码树。 如果您在源代码树中构build任何这些程序,那么您仍然会遇到问题,正如典型的那样。 (即./configure && make && make install

    发生这种情况有两个原因:

    • 生成的二进制文件( *.o*.so*.a*.exe …)在两个Cygwins之间将是不兼容的,所以除非在Cygwins之间切换时make clean ,否则它们将被留下,导致混乱。

    • 即使你记得make clean一下,Cygwin下的./configure的输出可能会不一样,所以试图在32位Cygwin下configuration的64位Cygwin(反之亦然)下生成一个程序可能会失败。

    这个陷阱有几种方法:

    • 放弃共享/usr/local/src

    • 请记住,只要切换Cygwins,就要make clean && ./configure

    • 为每个Cygwin变体单独构build树外构build 。

      这比以前的选项更干净,更快,更可靠,但并不是所有的源代码树都设置为允许这样做。

如果您没有足够的理由来解决这些问题,请安装一个版本或其他版本,而不是两个版本。

如果您的32位Cygwin安装正常,并且不需要64位Cygwin的好处,则您不必觉得必须使用64位安装来replace它。 32位Cygwin不会很快消失。

同时,如果我正在设置一个新的64位Windows盒子,我会安装64位的Cygwin,除非我知道前面没有一个软件包移植,我不需要,我不是愿意自己做端口。 这是稳定的,大部分是完整的。

Cygwin的联合首席开发人员Corinna Vinschen在Cygwin 1.7.25发行说明中说 :

关于64位发布

这只是Cygwin官方发布的第四个官方版本,作为AMD64 Windows系统的64位版本,所以它还是相当新的。

目前64位的Cygwin发行版没有32位版本的软件包,但是它与32位版本一样稳定,随着时间的推移,更多的软件包将可用。

如果您已经在64位Windows机器上运行了32位版本的Cygwin,则可以继续操作。 如果您计划在64位Windows计算机上安装Cygwin,请考虑使用新的64位Cygwin版本,除非您需要某些在64位版本中尚未提供的软件包。

“升级”到64位的另一个问题是没有AFAIK的方式来自动重新安装在32位安装中的相同的软件包列表,所以你将不得不精心制作一个列表的安装软件包,并在新的安装中辛苦地检查它们,以便重新安装之前回到以前的位置。

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

与Cygwin x64我从来没有这样的问题。

同时安装。 它不需要太多的时间或磁盘空间,一些软件包不适用于cygwin64。 (把他们放在不同的目录!)

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

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

没有足够的信誉评论选定的答案,所以在这里:

如何在c:\cygwin安装Cygwin64(通过setup-x86_64.exe ),在c:\cygwin32 (通过setup-x86.exe )中执行一个辅助Cygwin32安装,然后在/cygdrive/c/cygwin32/<for_each_of_the_bin_dirs> $ PATH的结尾?

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

如果setup-x86_64.exe能够提供所有Cygwin应用程序的版本setup-x86_64.exe统一列表,并且只在需要时(使用popup窗口build议做64位端口)来执行32位安装,那将会非常有用。