Ответ 1
Когда-то в 64-битном Cygwin отсутствовало множество пакетов, присутствующих в 32-разрядном Cygwin, но сегодня список таких пакетов довольно короткий. Поскольку это была последняя существенная причина для создания 32-разрядных установок Cygwin в 64-разрядных системах Windows, вряд ли у вас есть веские причины сделать это сегодня.
Самое большое преимущество использования 64-разрядного Cygwin - доступ к большему количеству памяти. Есть два разных способа, которыми обладает преимущество:
-
Многие программы Cygwin будут использовать столько оперативной памяти, сколько вы можете их предоставить.
Если вы используете версию Cygwin R с большими наборами данных, например, вы должны переключиться на 64-разрядный Cygwin ASAP, потому что R хочет загрузить весь набор данных в ОЗУ, поэтому использование 32-разрядного Cygwin на 64-битной машине искусственно ограничивает то, что R может выполнить под Cygwin.
-
То, как Cygwin имеет дело с DLL перед вызовами
fork()
, требует, чтобы они были загружены по фиксированному адресу памяти.(Это механизм
rebase
, обычно запускается автоматически в конце каждого запуска Cygwinsetup.exe
.)Одним из следствий этого является то, что в 32-разрядном Cygwin было возможно установить так много пакетов, что
rebase
закончилось из адресного пространства, пытаясь предоставить им все уникальные адреса загрузки. Экспоненциально больший размер 64-разрядного адресного пространства устраняет эту возможность сейчас практически для всех практических целей.
64-разрядный Cygwin также может быть немного быстрее, в некоторых случаях.
Вы можете одновременно установить и запустить обе версии Cygwin. Вы можете даже иметь окно MinTTY для каждого из них одновременно. Тем не менее, лучше всего рассматривать их как отдельные миры, так как два Cygwins принципиально несовместимы. У вас возникнут проблемы, если вы попытаетесь заставить их взаимодействовать.
Эта фундаментальная несовместимость может укусить вас несколькими способами:
-
Несмотря на то, что 64-разрядная программа Cygwin может запускать 32-разрядную программу Cygwin, и наоборот, на этой границе не будет работать несколько механизмов межпроцессного взаимодействия: разделяемая память POSIX, передача файлов,
getppid(2)
... -
Даже некоторые вещи, о которых вы не думаете, как кросс-процесс, не удастся, если вы попытаетесь сделать два разных Cygwins взаимодействующими. Большая часть содержимого Cygwin
/proc
поступает из DLL, например, поэтому он будет отличаться между двумя Cygwins, хотя они работают одновременно на одной машине. -
Предположим, вы хотели поделиться
/usr/local
между Cygwins, поэтому вам не нужно иметь две копии всего программного обеспечения, которое вы создали из источника.После прочтения первого пункта выше вы понимаете, что не можете делиться
/usr/local/bin
или/usr/local/lib
.Подумав об этом, вы решили, что хотите просто поделиться
/usr/local/src
, чтобы у вас, по крайней мере, не было дубликатов исходных деревьев. У вас все еще будут проблемы, если вы создадите какую-либо из этих программ в исходном дереве, как это обычно бывает. (т.е../configure && make && make install
)Это происходит по двум причинам:
-
Сгенерированные двоичные файлы (
*.o
,*.so
,*.a
,*.exe
...) будут несовместимы между двумя Cygwins, поэтому, если вы не используетеmake clean
при переключении между Cygwins, они оставаясь позади, вызывая путаницу. -
Даже если вы запомните
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, если бы не знал, что у него нет пакета, который мне нужен, и я не желал делать сам порт. Он стабильный и в основном полный.