是否可以从Cygwin 32bit切换到Cygwin 64bit?

时间:2013-08-20 07:26:04

标签: cygwin 64-bit 32bit-64bit windows-7-x64 transitions

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

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

6 个答案:

答案 0 :(得分:89)

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

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

  1. 许多Cygwin程序会使用尽可能多的RAM。

    例如,如果您使用具有大型数据集的Cygwin版R,则应该切换到64位Cygwin ASAP,因为R想要将整个数据集加载到RAM中,因此使用32- 64位机器上的Cygwin位人为地限制了R在Cygwin下可以完成的任务。

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

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

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

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

    您可以同时安装和运行两个版本的Cygwin。您甚至可以同时为每个窗口创建一个MinTTY窗口。然而,最好将它们视为单独的世界,因为两个Cygwins是fundamentally incompatible。如果你试图使它们互操作,你将遇到麻烦。

    这种基本的不兼容性可能会在几个方面让你感到困惑:

    1. 即使64位Cygwin程序可以启动32位Cygwin程序,反之亦然,但是几个跨进程机制无法跨越该边界:POSIX共享内存,文件句柄传递,{{1 }} ...

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

    3. 假设您想在Cygwins之间共享/proc,那么您不必拥有从源代码构建的所有软件的两个副本。

      阅读完上述第一项后,您会发现无法共享/usr/local/usr/local/bin

      在考虑之后,您决定只想共享/usr/local/lib,这样您至少不必拥有重复的源树。如果你在源代码树中构建任何这些程序,你仍然会遇到问题,这是典型的。 (即/usr/local/src

      这种情况有两个原因:

      • 生成的二进制文件(./configure && make && make install*.o*.so*.a ...)在两个Cygwins之间不兼容,所以除非你{{1在Cygwins之间切换时,它们会被遗忘,造成混乱。

      • 即使你记得*.exe,每个Cygwin下的make clean输出也可能不同,所以尝试在64位Cygwin下构建一个32位以下的程序位Cygwin(反之亦然)可能会失败。

      这个陷阱有几种方法:

      • 也放弃分享make clean

      • 每当您切换Cygwins时,请记住./configure

      • 为每个Cygwin变体单独构建build out-of-tree

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

    4. 如果您没有充分理由忍受此类问题,请安装一个版本或另一个版本,而不是两者。

      如果你有一个正常运行的32位Cygwin设置并且不需要64位Cygwin的好处,你不必觉得必须用64位安装替换它。 32位Cygwin不会很快消失。

      与此同时,如果我正在设置一个新的64位Windows机箱,我会在其上安装64位Cygwin,除非我事先知道它没有我需要的移植软件包,而且我我不愿意自己做这个港口。它很稳定,而且大部分都是完整的。

答案 1 :(得分:6)

作为Cygwin的一部分,Cygwin 1.7.25 release notes的联合首席开发人员Corinna Vinschen已经说过以下内容:

  

关于64位释放

     

这只是Cygwin官方发布的第四个官方版本   作为AMD64 Windows系统的64位版本提供,所以它仍然是   很新。

     

现在64位的Cygwin发行版并没有那么多   打包为32位版本,但它与32位一样稳定   版本,随着时间推移将有更多的包。

     

如果您已在64位Windows上运行32位版本的Cygwin   机器,你可以继续这样做。如果您计划新安装   在64位Windows机器上的Cygwin,考虑使用新的64位   Cygwin版本,除非您需要某些尚未提供的软件包   64位版本。

答案 2 :(得分:4)

“升级”到64位的另一个问题是AFAIK没有一种方法可以自动重新安装32位安装中的相同软件包列表,所以你必须煞费苦心制作已安装软件包的列表,并在新安装中仔细检查它们,以便在重新安装之前回到原来的位置。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

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

如何在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应用程序的版本感知统一列表,并且仅在需要时执行32位安装(使用弹出窗口建议执行64位端口),这将非常有用