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

60

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

我没有特定的需求需要我转换为64位,但我想知道是否应该这样做。这样做是否明智?有哪些优缺点? 在进行过渡时是否存在已知的总体问题?


3
如果没有出现问题就不要改变它。 - Paul R
我正在使用NXmachine 3.5连接虚拟桌面,但是在64位安装中cygwin1.dll存在严重冲突。因此,我回退到了32位的cygwin。 - user167328
6个回答

91
从前,64位Cygwin缺少32位Cygwin中存在的许多软件包,但今天这些包的列表相当短。由于这是在64位Windows系统上创建新的32位Cygwin安装的最后一个重要原因,所以今天你很难有一个好的理由去做那个操作。
使用64位Cygwin的最大优点是可以访问更多的内存。这个优势有两种非常不同的表现方式:
  1. 许多Cygwin程序会尽可能利用你所能提供的所有RAM。

    例如,如果你使用带有大型数据集的R的Cygwin版本,你应该尽快切换到64位Cygwin,因为R想要将整个数据集加载到RAM中,因此在64位机器上使用32位Cygwin人为地限制了R在Cygwin下的实现能力。

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

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

    其中一个后果是,在32位Cygwin中安装了太多的软件包,导致rebase试图给它们分配所有唯一的加载地址时,会耗尽地址空间。64位地址空间指数级增长消除了这种可能性,从实际目的来看。

64位Cygwin在某些情况下也可能更快。

您可以同时安装和运行两个版本的Cygwin。您甚至可以同时打开每个版本的MinTTY窗口。然而,最好将它们视为独立的世界,因为这两个Cygwin是基本不兼容的。如果您尝试让它们相互操作,就会遇到麻烦。

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

  1. 尽管64位Cygwin程序可以启动32位Cygwin程序,反之亦然,但是一些跨进程机制在这个边界上不会起作用:POSIX共享内存、文件句柄传递、getppid(2)等。

  2. 即使你没有考虑到的一些跨进程操作,在试图让两个不同的Cygwin互操作时也会失败。例如,Cygwin的/proc目录中的大部分内容都来自于DLL,因此在两个同时在同一台机器上运行的Cygwin中,它们将是不同的。

  3. 假设您想要在Cygwin之间共享/usr/local,以便无需拥有从源代码构建的所有软件的两个副本。

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

    经过思考,您决定只共享/usr/local/src,以至少不必拥有重复的源代码树。如果您在源码树中构建任何这些程序,这仍然会导致问题。(即./configure && make && make install

    这出现的原因有两个:

    • 生成的二进制文件(*.o*.so*.a*.exe等)在两个Cygwin之间是不兼容的,因此除非您在切换Cygwin时执行make clean,否则它们将被遗留下来,导致混乱。

    • 即使您记得make clean,每个Cygwin下的./configure的输出也可能是不同的,因此试图在32位Cygwin下配置的情况下构建64位Cygwin中的程序(反之亦然)可能会失败。

    有几种方法可以摆脱这个困境:

    • 放弃共享/usr/local/src

    • 记得在切换Cygwin时执行make clean && ./configure

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

      这比前一个选项更清洁、更快速、更可靠,但并非所有源代码树都设置为允许这样做。

如果你没有充分的理由忍受这些问题,那么请安装其中一个版本,而不是同时安装两个版本。
如果你已经拥有一个正常运行的32位Cygwin安装,并且不需要64位Cygwin的优势,那么你不必觉得自己必须将其替换为64位安装。32位Cygwin不会很快消失。
同时,如果我正在设置一个新的64位Windows系统,我会安装64位Cygwin,除非我事先知道它没有我需要的软件包,并且我不愿意自己进行移植。它是稳定和基本完整的。

编写一个脚本,从svn/git中获取您的源代码以进行新鲜更新,这样您就不必担心污染构建。仍然不使用存储库进行源代码控制的人数令人惊讶和极其困惑/疯狂。 - lxx

8
Corinna Vinschen,Cygwin的联合开发人员之一,在Cygwin 1.7.25发布说明中说道:
关于64位版本发布 这只是第四个官方发布的Cygwin版本,作为AMD64 Windows系统的64位版本,因此还相当新。 目前,64位Cygwin发行版没有32位版本那么多的软件包,但它与32位版本一样稳定,并且随着时间的推移会提供更多的软件包。 如果您已经在64位Windows机器上运行32位版本的Cygwin,则可以继续使用。如果您计划在64位Windows机器上安装Cygwin,请考虑使用新的64位Cygwin版本,除非您需要某些尚不可用于64位版本的软件包。

5

升级到64位的另一个问题是,据我所知,没有办法自动重新安装与32位安装相同的软件包列表,因此您将不得不费力地列出已安装的软件包,并逐个检查它们以在新安装中勾选所有软件包,以便回到重新安装之前的状态。


我现在正在安装两个版本。64位版本会创建一个单独的文件夹,所以你可以把32位版本留在那里。 - John
20
我知道这有点过时了,但我想指出这并不是很麻烦:cygcheck -c | sed -e 's/ .*//' | sed '1,2d' > packageList.out 将创建一个漂亮的列表,列出所有已安装的软件包。然后,您可以使用 -P 开关从命令行运行 setup*.exe 安装您可从输出文件中获取的软件包列表,方法为 $(paste -d, -s packageList.out)。我有所有这些的脚本,因此我可以在32位和64位的多台计算机上重新生成我的Cygwin环境。您需要先进行基本安装,然后再添加其他已安装的软件包。 - SeeJayBee
@Chris,你是救星。感谢你的评论。 - David Conrad

3

使用Cygwin x64有许多优势之一是更好的内存管理。我曾经遇到很多“地址已被使用”或“fork:重试:资源暂时不可用”的问题,这迫使我有时一天要运行几次“rebaseall”。

但是,使用Cygwin x64我从未遇到过这样的问题。


你确定那不是你系统特有的问题吗?我在Cygwin32上从未遇到过这种情况。 - einpoklum
如果你使用基本的东西,这种情况是不会发生的。但是,如果你安装了Python Matplotlib和SciPy或者使用了很多X程序,你就会遇到这些问题。我在运行Windows 7、8和10的3台不同电脑上都遇到过这些问题。 - nowox
我几年前放弃了使用cygwin,因为在远程共享上出现了文件权限问题(无法使用),以及“fork:retry:Resource temporarily unavailable”的错误。这次我将安装x64位版本。 - PatS

1

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

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

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


3
SQLite限制与CPU字长无关。你可能只是遇到了一个临时构建选择,该选择使用RAM作为临时空间而非磁盘空间。目前在Cygwin上的SQLite版本不再这样做了。请在Cygwin 32上重试,并在此处(或Cygwin邮件列表上)回复,如果问题仍然存在。 - Warren Young

0

声望不足,无法在所选答案上发表评论,因此在此提出:

安装Cygwin64到c:\cygwin(通过setup-x86_64.exe),然后在c:\cygwin32中进行第二个Cygwin32安装(通过setup-x86.exe),最后将/cygdrive/c/cygwin32/<for_each_of_the_bin_dirs>添加到$PATH的末尾,这样就可以默认运行64位应用程序,但如果没有64位版本,则允许调用32位应用程序。

如果setup-x86_64.exe能够呈现所有Cygwin应用程序的版本感知统一列表,并且仅在需要时执行32位安装(并弹出建议进行64位移植的弹出窗口),那将非常有用。


当32位应用程序需要在64位和32位Cygwin中都可用的libwhatever.dll时,这会带来问题。很可能会导致崩溃。 - rr-
1
@rr-:为什么只要涉及Cygwin,Windows就会突然开始加载错误位数的PE文件?(请注意,Windows的动态加载器在搜索DLL时会跳过不符合正确架构的文件。它并不会尝试加载错误架构的库,只是为了运行错误架构的代码导致程序崩溃。)真正的问题在于Cygwin的32位和64位版本彼此大多毫不知情,并且Cygwin引入的几乎所有IPC机制(例如pty或unix套接字)都无法在两者之间工作。 - SamB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接