我一直在使用Cygwin(很长一段时间)。具体来说,我在Win7上使用它(包括gcc / g ++)进行开发工作。我刚刚注意到现在存在64-bit version。
我没有特定的需求,需要我转换到64位,但我想知道是否要这样做。这是可取的吗?优缺点都有什么?在进行转换时是否存在已知的过度电弧问题?
答案 0 :(得分:89)
曾几何时,64位Cygwin缺少32位Cygwin中存在的许多软件包,但今天the list of such packages很短。由于这是在64位Windows系统上创建新的32位Cygwin安装的最后一个重要原因,因此您今天不太可能有充分的理由这样做。
使用64位Cygwin的最大优势是可以访问更大的内存。优势有两种截然不同的方式:
许多Cygwin程序会使用尽可能多的RAM。
例如,如果您使用具有大型数据集的Cygwin版R,则应该切换到64位Cygwin ASAP,因为R想要将整个数据集加载到RAM中,因此使用32- 64位机器上的Cygwin位人为地限制了R在Cygwin下可以完成的任务。
Cygwin面对fork()
次调用处理DLL的方式要求将它们加载到固定的内存地址。
(这是rebase
mechanism,通常在每次运行Cygwin的setup.exe
时自动运行。)
这样做的一个结果是,在32位Cygwin中可以安装这么多包rebase
用尽地址空间试图为它们提供所有唯一的加载地址。对于所有实际目的,64位地址空间的指数级大小现在消除了这种可能性。
在某些情况下,64位Cygwin也可以更快一点。
您可以同时安装和运行两个版本的Cygwin。您甚至可以同时为每个窗口创建一个MinTTY窗口。然而,最好将它们视为单独的世界,因为两个Cygwins是fundamentally incompatible。如果你试图使它们互操作,你将遇到麻烦。
这种基本的不兼容性可能会在几个方面让你感到困惑:
即使64位Cygwin程序可以启动32位Cygwin程序,反之亦然,但是几个跨进程机制无法跨越该边界:POSIX共享内存,文件句柄传递,{{1 }} ...
当您尝试使两个不同的Cygwins互操作时,即使是一些您不认为是跨进程的事情也会失败。例如,Cygwin的getppid(2)
的大部分内容来自DLL中,因此两个Cygwins之间的内容会有所不同,即使它们在同一台机器上同时运行。
假设您想在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。
这比以前的选项更干净,更快速,更可靠,但并非所有源树都设置为允许这样做。
如果您没有充分理由忍受此类问题,请安装一个版本或另一个版本,而不是两者。
如果你有一个正常运行的32位Cygwin设置并且不需要64位Cygwin的好处,你不必觉得必须用64位安装替换它。 32位Cygwin不会很快消失。
与此同时,如果我正在设置一个新的64位Windows机箱,我会在其上安装64位Cygwin,除非我事先知道它没有我需要的移植软件包,而且我我不愿意自己做这个港口。它很稳定,而且大部分都是完整的。
答案 1 :(得分:6)
关于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 use
或fork: 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位端口),这将非常有用