从Cygwin 32bit切换到Cygwin 64bit是否明智?
我一直在使用Cygwin (很长一段时间)。 具体来说,我在Win7上使用它(包括gcc / g ++)进行开发工作。 我刚刚注意到现在存在一个64位版本 。
我没有具体的需要,我需要转换到64位,但我想知道是否要这样做。 这是可取的吗? 优缺点都有什么? 在转换过程中是否存在过度的问题?
曾几何时,64位Cygwin错过了32位Cygwin中的许多软件包,但是今天这种软件包的列表非常短。 由于这是在64位Windows系统上创build新的32位Cygwin安装的最后一个重要原因,因此您今天不太可能有充分的理由这样做。
使用64位Cygwin的最大好处是可以访问更多的内存。 有两种截然不同的方式来performance自己的优势:
-
许多Cygwin程序将使用尽可能多的RAM,你可以给他们。
例如,如果你使用的Cygwin版本的R与大数据集,你应该切换到64位Cygwin ASAP,因为R想要加载到RAM的整个数据集,所以使用64位的32位Cygwin机器人为地限制了R可以在Cygwin下完成的工作。
-
Cygwin在面对
fork()
调用时处理DLL的方式要求将它们加载到固定的内存地址。(这是
rebase
机制 ,通常在Cygwin的setup.exe
每次运行结束时自动运行。)这样做的一个结果就是,在32位的Cygwin中可能会安装这么多的软件包,使地址空间不足,试图给他们所有唯一的加载地址。 对于所有的实际目的,64位地址空间的指数级更大的大小现在消除了这种可能性。
在某些情况下,64位的Cygwin也可以更快一些。
你可以同时安装和运行两个版本的Cygwin。 您甚至可以同时为每个提供一个MinTTY窗口。 尽pipe如此,最好将它们作为独立的世界来对待,因为两个Cygwins基本上是不相容的 。 如果您尝试让它们互操作,您将遇到麻烦。
这种根本性的不兼容性可能会以多种方式咬你:
-
即使一个64位的Cygwin程序可以启动一个32位的Cygwin程序,反之亦然,几个跨进程机制将无法跨越这个边界:POSIX共享内存,文件句柄传递,
getppid(2)
… -
即使有些事情你不认为是跨进程将会失败,当你试图使两个不同的Cygwins互操作。 Cygwin的
/proc
大部分内容都来自于DLL内部,所以它们在两个Cygwins之间是不同的,即使它们在同一台机器上同时运行。 -
假设你想在Cygwins之间共享
/usr/local
,所以你不需要从源代码中创build所有软件的两个副本。读完上面的第一项后,您会意识到不能共享
/usr/local/bin
或/usr/local/lib
。思考完之后,你决定只是想共享
/usr/local/src
这样你至less不必拥有重复的源代码树。 如果您在源代码树中构build任何这些程序,那么您仍然会遇到问题,正如典型的那样。 (即./configure && make && make install
)发生这种情况有两个原因:
-
生成的二进制文件(
*.o
,*.so
,*.a
,*.exe
…)在两个Cygwins之间将是不兼容的,所以除非在Cygwins之间切换时make clean
,否则它们将被留下,导致混乱。 -
即使你记得
make clean
一下,Cygwin下的./configure
的输出可能会不一样,所以试图在32位Cygwin下configuration的64位Cygwin(反之亦然)下生成一个程序可能会失败。
这个陷阱有几种方法:
-
放弃共享
/usr/local/src
。 -
请记住,只要切换Cygwins,就要
make clean && ./configure
。 -
为每个Cygwin变体单独构build树外构build 。
这比以前的选项更干净,更快,更可靠,但并不是所有的源代码树都设置为允许这样做。
-
如果您没有足够的理由来解决这些问题,请安装一个版本或其他版本,而不是两个版本。
如果您的32位Cygwin安装正常,并且不需要64位Cygwin的好处,则您不必觉得必须使用64位安装来replace它。 32位Cygwin不会很快消失。
同时,如果我正在设置一个新的64位Windows盒子,我会安装64位的Cygwin,除非我知道前面没有一个软件包移植,我不需要,我不是愿意自己做端口。 这是稳定的,大部分是完整的。
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位版本中尚未提供的软件包。
“升级”到64位的另一个问题是没有AFAIK的方式来自动重新安装在32位安装中的相同的软件包列表,所以你将不得不精心制作一个列表的安装软件包,并在新的安装中辛苦地检查它们,以便重新安装之前回到以前的位置。
Cygwin x64有一些很大的优势。 其中之一就是更好的内存pipe理。 我尝试了很多address already in use
,或fork: retry: Resource temporarily unavailable
,迫使我每天有几次运行rebaseall
。
与Cygwin x64我从来没有这样的问题。
同时安装。 它不需要太多的时间或磁盘空间,一些软件包不适用于cygwin64。 (把他们放在不同的目录!)
我不知道在cygwin64中的sqlite3是否可以索引大小超过4G的数据库,但我知道在cygwin32中的sqlite3不能,而在64位Linux中的sqlite3可以。
cygwin64仍然没有pdftk(PDF工具包)。
没有足够的信誉评论选定的答案,所以在这里:
如何在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应用程序的版本setup-x86_64.exe
统一列表,并且只在需要时(使用popup窗口build议做64位端口)来执行32位安装,那将会非常有用。