【问题标题】:Is it advisable to switch from Cygwin 32bit to Cygwin 64bit?是否建议从 Cygwin 32 位切换到 Cygwin 64 位?
【发布时间】:2013-08-22 03:51:36
【问题描述】:

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

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

【问题讨论】:

  • 如果没坏就不要修。
  • 我正在使用 NXmachine 3.5 连接到虚拟桌面,但与 64 位安装的 cygwin1.dll 发生严重冲突。所以我恢复到 cygwin 32 位。

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


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

  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,否则它们是会被抛在后面,造成混乱。

    • 1234563反之亦然)可能会失败。
  4. 有几种方法可以摆脱这个陷阱:

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

  • 在切换 Cygwins 时请记住make clean && ./configure

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

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

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

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

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

【讨论】:

  • 编写一个脚本来从 svn/git 中重新提取/更新源代码,这样您就不必担心会污染构建。仍然不使用 repo 进行源代码控制的人数惊人,非常令人困惑/疯狂
【解决方案2】:

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

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

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

【讨论】:

  • SQLite limits 不依赖于 CPU 字长。您可能刚刚遇到一个临时构建选择,它使用 RAM 作为临时空间而不是磁盘空间。 Cygwin 上的当前 SQLite 版本不再这样做了。请在 Cygwin 32 上重试,如果问题仍然存在,请在此处(或在 Cygwin 邮件列表中)回复。
【解决方案3】:

Cygwin 的联合首席开发人员 Corinna Vinschen 作为Cygwin 1.7.25 release notes 的一部分发表了以下言论:

关于 64 位版本

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我现在都在安装。 64 位会创建一个单独的文件夹,因此您可以将 32 位的文件夹留在那里。
    • 我知道这有点老了,但我想指出它并不是那么辛苦:cygcheck -c | sed -e 's/ .*//' | sed '1,2d' > packageList.out 将创建一个不错的小列表,列出所有已安装的软件包。然后,您可以使用 -P 开关和您的软件包从命令行运行 setup*.exe,您可以使用以下命令从输出文件中获取它们:$(paste -d, -s packageList.out)。我有所有这些的脚本,所以我可以在 32 位和 64 位的多台机器上重新生成我的 Cygwin 环境。您想先进行基本安装,然后添加其他已安装的软件包。
    • @Chris 你是救生员。感谢您的评论。
    【解决方案5】:

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

    如何在c:\cygwin(通过setup-x86_64.exe)中安装Cygwin64,在c:\cygwin32(通过setup-x86.exe)中安装第二个Cygwin32,然后在$PATH 末尾添加/cygdrive/c/cygwin32/<for_each_of_the_bin_dirs>

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

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

    【讨论】:

    • 当 32 位应用程序需要在 64 位和 32 位 Cygwin 中都可用的 libwhatever.dll 时,这会带来问题。很可能会崩溃。
    • @rr-: 为什么 Windows 会因为 Cygwin 的参与而突然开始加载错误位数的 PE? (请注意,Windows 的动态加载器在搜索 DLL 时会跳过不适合正确体系结构的文件。它确实不会尝试加载错误的架构库,只是为了让程序崩溃并烧毁试图为错误的架构运行代码。)真正的问题是 Cygwin 的 32 位和 64 位版本大多相互忽略,并且基本上没有 IPC 机制(例如 ptys 或 unix 套接字) Cygwin 所发挥的作用将在两者之间起作用。
    【解决方案6】:

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

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

    【讨论】:

    • 您确定这不是您的系统特有的问题吗?我在 Cygwin32 上从来没有遇到过这种情况。
    • 如果你使用基本的东西就不会发生这种情况,但是如果你用 SciPy 安装 Python Matplotlib 或使用很多 X 程序,你会遇到这些问题。我在运行 Windows 7、8 和 10 的 3 台不同的 PC 上遇到了它们。
    • 几年前我放弃了使用 cygwin,因为文件权限被破坏(无法使用)(在远程共享上)和 fork: retry: Resource temporarily unavailable。我这次安装的是x64位版本。
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多