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

ein*_*ica 58 64-bit cygwin transitions 32bit-64bit windows-7-x64

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

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

War*_*ung 89

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

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

  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中可以安装这么多rebase用尽地址空间的软件包,试图为它们提供所有唯一的加载地址.对于所有实际目的,64位地址空间的指数级大小现在消除了这种可能性.

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

您可以同时安装和运行两个版本的Cygwin.您甚至可以同时为每个窗口创建一个MinTTY窗口.然而,最好将它们视为单独的世界,因为两个Cygwins 从根本上是不相容的.如果您尝试让它们进行互操作,您将遇到麻烦.

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

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

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

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

    阅读完上面的第一项后,您会发现无法分享/usr/local/bin/usr/local/lib.

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

    出现这种情况有两个原因:

    • 生成的二进制文件(*.o,*.so,*.a,*.exe...)将两个Cygwins之间不兼容的,所以除非你make cleanCygwins之间切换时,他们会被抛在后面,造成混乱.

    • 即使你记得make clean,./configure每个Cygwin下的输出可能会有所不同,所以试图在64位Cygwin下构建一个在32位Cygwin下配置的程序(反之亦然)可能会失败.

    这个陷阱有几种方法:

    • 也放弃分享/usr/local/src.

    • 记得make clean && ./configure每当你切换Cygwins时.

    • 构建打造出的树分别为每个Cygwin的变种.

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

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

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

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


ein*_*ica 6

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位版本中尚未提供的某些软件包.


Pab*_*ern 5

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

  • 我知道这有点旧,但我想指出它并不是那么辛苦:`cygcheck -c | sed -e 's/ .*//' | sed '1,2d' > packageList.out` 将创建一个包含所有已安装软件包的小列表。然后,您可以使用 -P 开关和您的包从命令行运行 setup*.exe,您可以使用以下命令从输出文件中获取:`$(paste -d, -s packageList.out)`。我有所有这些的脚本,所以我可以在 32 位和 64 位的多台机器上重新生成我的 Cygwin 环境。您想先进行基本安装,然后添加其他已安装的软件包。 (20认同)