ТехноСаратов → Блог

Cygwin vs. MinGWБлогПрограммы

Только что наткнулся на аналогичную прошлогоднюю тему в нашем форуме, где мною был дан не совсем корректный ответ. За эти пол года в боях с GCC под Windows я на… брался некоторого опыта, потому считаю необходимым ответить более полно.

Кто есть кто?

MinGW — это компилятор + WinAPI + минималистичный набор юникс программ (vim, make, bash, m4, diff…). Плюс можно поставить tcl/tk, но это не является привелегией MinGW, т.к. существуют полностью автономные версии. Все это отлично подходит для обучения программированию, а при некотором ручном доведении среды и для вполне профессионального программирования под Windows. То есть MinGW — это именно компилятор и минимальный набор инструментов для разработки Windows программ.

Cygwin — это линукс среда под Windows. То есть, это не просто GCC, но набор всех возможных инструментов разработки и пользовательского ПО перенесенного из Linux в Windows. Что включает и многочисленные библиотеки Linux`а, языки от питона до лиспа и библиотеку X11. В итоге, Cygwin — это среда для разработки, компиляции и исполнения Linux программ под Windows.

Кому все это надо?

Если разрабатываемый вами проект не выходит за рамки таких библиотек как wxWidgets и QT, то можно смело выбирать MinGW. Или даже версию с интегрированной средой Dev-Cpp. Последнее особенно удобно на первых парах, когда не хочется или нет времени заморачиваться со всякими Makefile и autoconf.

Однако, если вам вдруг захочется собрать POSIX приложение средствами MinGW, просто введя ./configure, make, make install, то, скорее всего, ничего не получится. Соответствие POSIX у MinGW ровно такое же как и у самой Windows, по этому проект сначала попросит какой нибудь pthreads, потом может JThreads (если он на С++), потом выяснится несоответствие стандартам POSIX include файлов в директории sys и так до бесконечности.

В общем, если у вас вдруг появилось дикое желание использовать в своем проекте переносимую POSIX совместимую библиотечку, и Вы собираетесь компилировать все это с помощью MinGW, то советую сначала хорошенько удариться головой об стену и только после этого, если желание не пройдет, уже резать вены.

В Cygwin положение диаметральное. Соответствие POSIX достаточное, для компиляции большинства программ его требующих. Компиляция программ требующих WinAPI также возможна, т.к. Cygwin использует соответствующие виндовые библиотеки от MinGW. Но приемуществ при этом перед самим MinGW никакого. А именно, многие переносимые библиотеки, компилируясь в Cygwin отключают свои Windows функции. Получается не рыба не мясо. Вроде бы собрано под Windows, но всей системной мощности системы не использует.

Пример — аудио библиотека PortAudio. Под MinGW ее можно собрать с поддержкой ASIO (это такая технология воспроизведения аудио в реальном времени). Хотя и тут есть подводные камни. В Cygwin эта же библиотека собирается как для Windows, но без возможности работы с ASIO. Работать это будет через одно часто упоминаемое в широких кругах место. А именно через DirectSound. И если задача стояла в воспроизведении звука, а не в быстром воспроизведении звука в реальном времени то она в принципе будет решена не худшим образом. Иначе, все ваше приложение не будет соответствовать техническим требованиям.

Теперь вернемся к подводным камням, про которые я упомянул в предыдущем абзаце. Если Вы программист на чистом Си, поздравляю проблем с программированием под Windows у вас гораздо меньше, нежели у программистов на Си++. А дело в том, что рано или поздно вам захочется/придется использовать готовую бинарную библиотеку написанную на C++ и скомпилированную с помощью поприетарного компилятора MSVC++. А это означает, что ваша программа будет, скорее всего, бинарно несовместима с этой библиотекой. MS столько накуралесили в своем компиляторе, что программам для GCC приходится использовать специальные ассемблерные вставки для вызова библиотек написанных на С++. Та же PortAudio для обращения к аудио драйверам через ASIO интерфейс вынуждена использовать примерно вот такие макросы:

Но если бы эти ассемблерные вставки корректно работали, то верно я бы и не знал что они есть в коде. Но видимо драйвер к которому обращается PortAudio (kXasio) скомпилирован более новым MSVC++, чем подразумевал разработчик этой библиотеки, а потому все валится с ошибкой сегментации после инструкции call.

Нагнал я конечно страху 🙂 Но реальных проблем, верно, еще больше.

Юзабельность

Версия MinGW с Dev-Cpp наиболее удобна для новичков. Только не последняя версия с интегрированным wxWidgets. Это полная херня. Отбивает все силы к труду и желания изучать. Дело в том, что редактор форм, мягко выражаясь «сыроват». Виджеты летают по форме куда хотят, размеры при редактировании не соответствуют размерам при выполнении, таблица свойств объектов вообще не пойми как работает (если это можно назвать работой). В общем качаем стандартный.

Если сравнивать MinGW+MSYS и Cygwin, то последний бесспорно выигрывает. И не только из за количества полезных программ (это тоже конечно важно, так например из шеллов есть bash, tchs, zsh…), но и по качеству самих пакетов. То есть к пакетам из Cygwin прилагаются дополнительные усилия, пакеты MinGW+MSYS идут в первозданном виде. Кроме того, в Cygwin имеются разные терминалы (xterm, rxvt).

Юзабельность установки у Cygwin выше. MinGW и MSYS приходится ставить практически в ручную, получая при этом ценный опыт, новые извилины в мозгу и повышение ЧСВ. Cygwin очень прост в установке: сначала Вы закачиваете программу установки, затем, запустив ее, выбераете пакеты, которые необходимо скачать и установить, остальное делается на автопилоте. Так например я ставил закачку на ночь, а проснувшись увидел, что инсталлятор завершает установку.

Объем

MinGW+MSYS — если качать все подряд и плюс новый компилятор GCC 4.3.0, то выйдет около 300Мб. С другой стороны минималистичный набор описанный в статье «Установка MinGW и MSYS» будет весить всего ~30Мб трафика.

Cygwin среднего содержания для разработки, без исходников программ (можно качнуть отдельно, которые интересуют) также потребовал в районе 500-550Мб.

Итог

Пишешь под Windows? Не имеешь возможности использовать MSVC++? (студентам бесплатно). Изучаешь сам компилятор GCC или язык C++? Юзай MinGW.

Пишешь под Linux и хочешь переносить на Windows? Хочешь запустить готовую Linux программу под Windows? (не факт, что выйдет). Изучаешь программирование под Linux, но родители любят разложить косынку и поиграть в MSOffice 2007 и запрещают править разделы жесткого диска, так как ты уже пробовал и захерил гигабайты документов? Юзай Cygwin. Но помни, что идеален только Господь Бог и Hurd, а переносимость — одна из сложнейших тем разработки. Короче желаю терпения и упорства.

Линки

Cygwin
Доступные пакеты для Cygwin
Установка MinGW и MSYS
Dev-Cpp, качаем ту что «with Mingw/GCC 3.4.2»