В чем разница между Cygwin и MinGW?


Я хочу сделать свой проект c++ кросс-платформенным, и я рассматриваю возможность использования Cygwin/MinGW. Но в чем же разница между ними ?

другой вопрос, Смогу ли я запустить двоичный файл в системе без Cygwin/MinGW ?

15 547

15 ответов:

в качестве упрощения, это выглядит так:

  • скомпилировать что-то в Cygwin и вы компилируете его под Cygwin.

  • скомпилировать что-то в MinGW и вы компилируете его для Windows.

О Cygwin

цель Cygwin заключается в том, чтобы сделать перенос *nix-приложений в Windows намного проще, эмулируя многие из небольших сведения, которые предоставляют операционные системы на базе Unix, и задокументированы POSIX стандартов. Если ваше приложение предполагает, что оно может использовать функцию Unix, такую как каналы, доступ к файлам и каталогам в стиле Unix и т. д., то вы можете скомпилировать его в Cygwin, а сам Cygwin будет действовать как совместимость слое вокруг вашего приложения, так что многие из этих Unix-специфических парадигм могут по-прежнему использоваться с небольшими изменениями или без них приложение.

Если вы хотите скомпилировать что-то для Cygwin и распространить это результирующее приложение, вы также должны распространять среду выполнения Cygwin (предоставленную cygwin1.dll) вместе с и это имеет последствия для того, какие типы лицензий на программное обеспечение вы можете использовать.

О MinGW

MinGW-это порт Windows инструментов компилятора GNU, таких как GCC, Make, Bash и так далее. Он не пытается эмулировать или предоставлять полная совместимость с Unix, но вместо этого он обеспечивает минимально необходимую среду для использования GCC (компилятор GNU) и небольшое количество других инструментов на Windows. Он не имеет уровня эмуляции Unix, такого как Cygwin, но в результате ваше приложение должно быть специально запрограммировано для работы в Windows, что может означать значительные изменения, если оно было создано для работы в стандартной среде Unix и использует специфические для Unix функции, такие как упомянутый ранее. По умолчанию код, скомпилированный в GCC MinGW, будет компилироваться в собственный целевой объект Windows X86, в том числе .exe и .dll файлы, хотя вы также можете скомпилировать с правильными настройками. MinGW является альтернативой с открытым исходным кодом Microsoft Visual C++ компилятор и связанные с ним инструменты связывания / создания.

существуют достаточно сложные кросс-платформенные фреймворки, которые позволяют легко переносить приложения в различные операционные системы - например Qt framework - это популярный фреймворк для кросс-платформенных приложений. Если вы используете такую структуру с самого начала, вы можете не только уменьшить свои головные боли, когда приходит время для переноса на другую платформу, но вы можете использовать одни и те же графические виджеты - окна, меню и элементы управления - на всех платформах, если вы пишете приложение с графическим интерфейсом.

Cygwin-это попытка создать полную среду UNIX / POSIX в Windows. Для этого он использует различные библиотеки DLL. Хотя эти библиотеки DLL покрываются GPLv3+, их лицензия содержит исключение, который не заставит производного произведения должны быть охвачены лицензией GPLv3+. MinGW-это набор компиляторов C/C++, который позволяет создавать исполняемые файлы Windows без зависимости от таких DLL - вам нужны только обычные среды выполнения MSVC, которые являются частью любой нормальной Microsoft Windows установка.

вы также можете получить небольшую среду UNIX / POSIX, скомпилированную с помощью MinGW под названием MSYS. Он не имеет практически всех функций Cygwin, но идеально подходит для программистов, желающих использовать MinGW.

чтобы добавить к другим ответам, Cygwin поставляется с библиотеками и заголовками MinGW, и вы можете компилировать без ссылки на cygwin1.dll с помощью флага-mno-cygwin с gcc. Я очень предпочитаю это использовать простые MinGW и MSYS.

Wikipedia делает сравнение здесь.

из Cygwin это сайт:

  • Cygwin-это Linux-подобная среда для Windows. Он состоит из двух частей: DLL (cygwin1.dll), который действует как уровень эмуляции API Linux, обеспечивающий существенную функциональность API Linux.
  • коллекция инструментов, которые обеспечивают внешний вид Linux.

из MinGW это сайт:

MinGW ("Minimalistic GNU for Windows")-это коллекция свободно доступных и свободно распространяемых файлов заголовков Windows и библиотек импорта в сочетании с наборами инструментов GNU, которые позволяют создавать собственные программы Windows, которые не полагаются на какие-либо сторонние библиотеки DLL C runtime

программа использует библиотеку DLL, с Cygwin.dll, (или, возможно, набор DLL), чтобы обеспечить POSIX-подобную среду выполнения в Windows.

MinGW компилируется в собственное приложение Win32.

Если вы создадите что-то с Cygwin, любая система, в которую вы его установите, также будет нуждаться в библиотеке DLL Cygwin. Приложение MinGW не нуждается в какой-либо специальной среде выполнения.

прочитайте эти ответы на вопросы, чтобы понять разницу между Cygwin и MinGW.


Вопрос #1: я хочу создать приложение, которое я пишу исходный код один раз, скомпилировать его один раз и запустить его на любых платформах (например, Windows, Linux и Mac OS X...).

ответ #1: напишите свой исходный код в ЯВА. Скомпилируйте исходный код один раз и запустите его в любом месте.


Вопрос #2: я хочу создать приложение, которое я пишу исходный код один раз, но нет никаких проблем, что я компилирую исходный код для любых платформ отдельно (например, Windows, Linux и Mac OS X ...).

ответ #2: Напишите свой исходный код на C или C++. Использование стандартных заголовочных файлов только. Используйте подходящий компилятор для любого платформы (например, Visual Studio для Windows, GCC для Linux и XCode для Мак.) Обратите внимание, что вы не должны использовать любые расширенные возможности программирования скомпилируйте исходный код в платформы успешно работают. Если вы используете нет стандартных классов C или C++ или функции, ваш исходный код не компиляции на других платформах.


Вопрос №3: в ответ на вопрос №2, трудно использовать разные компиляторы для каждой платформы, есть ли кросс-платформенный компилятор?

ответ #3: Да, используйте компилятор GCC. Оно является кросс-платформенным компилятором. К скомпилируйте исходный код в Windows используйте MinGW что обеспечивает компилятор GCC для Windows и компилирует ваш источник код для собственной программы Windows. Не используйте любые расширенные функции программирования (например, Windows API) для компиляции исходный код на всех платформах успешно. Если вы используете Windows API функции, ваш исходный код не компиляции на других платформах.


Вопрос #4: Стандартные заголовочные файлы C или C++ не предоставляют никаких дополнительных функций программирования, таких как многопоточность. Что я могу сделать?

Ответ #4: Вы должны использовать POSIX (Переносимый Интерфейс Операционной Системы [для UNIX]) стандарт. Он обеспечивает много расширенные возможности программирования и инструменты. Многие операционные системы полностью или частично совместимый с POSIX (например, Mac OS X, Solaris, BSD/OS И...). Некоторые операционные системы пока не официально сертифицирован как POSIX совместимый, соответствует в значительной степени (как Linux, FreeBSD, Опенсолярис И...). программа обеспечивает в значительной степени POSIX-совместимая разработка и среда выполнения для Microsoft Окна.


таким образом:

чтобы использовать преимущества кросс-платформенного компилятора GCC в Windows, используйте MinGW.

чтобы использовать преимущества стандартных расширенных программных функций и инструментов POSIX в Windows, используйте Cygwin.

Википедия Говорит:

MinGW раздвоенный из версии 1.3.3 Cygwin. Хотя оба Cygwin и MinGW может использоваться для порта UNIX программы Windows, они есть разные подходы: Cygwin стремится обеспечить полный POSIX layer это обеспечивает эмуляцию нескольких системных вызовов и библиотек которые существуют на Linux,UNIX и BSD вариантов. Элемент POSIX layer работает на вершине Windows, жертвуя спектакль, где необходимо для совместимости. Соответственно, такой подход требует Windows программы, написанные с Cygwin для запуска поверх копилефта библиотека совместимости, которая должна распространяться вместе с программой с помощью программы source code. MinGW стремится обеспечить родной функциональность и производительность через прямые Windows API calls. В отличие от Cygwin,MinGW не требует уровня совместимости DLL и таким образом, программы не нужно распространять с помощью source code.

, потому что MinGW зависит от Windows API calls, он не может обеспечьте полный POSIX API; он не может скомпилировать некоторые UNIX applications это может быть скомпилировано с Cygwin. В частности, это применяется к приложениям, которые требуют POSIX функции как fork(),mmap() или ioctl() и те, которые ожидают запуска в a POSIX environment. Приложения, написанные с помощью cross-platform library который сам был портирован на MinGW, например SDL, wxWidgets,Qt, или GTK+, обычно компилируется так же легко в MinGW как и в Cygwin.

сочетание MinGW и MSYS обеспечивает небольшой, сдержанный среда, которая может быть загружена на съемный носитель без выхода записи в реестре или файлы на компьютере. Cygwin портативное предоставляет аналогичную функцию. Обеспечивая дополнительные функциональные возможности, Cygwin становится более сложным в установке и обслуживании.

также возможно cross-compile Windows applications с MinGW-GCC under POSIX systems. Это означает, что разработчики не нужна установка Windows с MSYS для компиляции программного обеспечения, которое будет бежать на Windows без Cygwin.

с точки зрения переноса программы на C, хороший способ понять это - взять пример:

#include <sys/stat.h>
#include <stdlib.h>

int main(void)
{
   struct stat stbuf;
   stat("c:foo.txt", &stbuf);
   system("command");
   printf("Hello, World\n");
   return 0;
}

если мы изменим stat to _stat, мы можем скомпилировать эту программу с Microsoft Visual C. Мы также можем скомпилировать эту программу с MinGW и с Cygwin.

в Microsoft Visual C программа будет связана с распространяемой библиотекой времени выполнения MSVC:mxvcrtnn.dll, где nn это какой-то суффикс версии. Чтобы отправить эту программу нам придется включите эту DLL. Что DLL предоставляет _stat,system и printf.

в разделе MinGW программа будет связана с msvcrt.dll, которая является внутренней, недокументированной, неверсионной библиотекой, которая является частью Windows и недоступна для использования в приложениях. Эта библиотека по существу является вилкой распространяемой библиотеки времени выполнения из MS Visual C для использования самой Windows.

в обоих случаях программа будет иметь схожее поведение:

  • the stat функция будет возвращать очень ограниченную информацию - например, никаких полезных разрешений или номера индекса.
  • путь c:file.txt решается в соответствии с текущим рабочим каталогом, связанным с диском c:.
  • system использует cmd.exe /c для выполнения внешней команды.

мы также можем скомпилировать программу под Cygwin. Аналогично распространяемому времени выполнения, используемому MS Visual C, программа Cygwin будет связана с временем выполнения Cygwin библиотеки: cygwin1.dll (собственно Cygwin) и cyggcc_s-1.dll (поддержка времени выполнения GCC). Поскольку Cygwin теперь находится под LGPL, мы можем упаковать нашу программу, даже если она не совместима с GPL, и отправить программу.

в Cygwin библиотечные функции будут вести себя по-разному:

  • the stat функция имеет богатую функциональность, возвращая значимые значения в большинстве полей.
  • путь c:file.txt вообще не понимается как содержащее a ссылка на букву диска, так как c: не сопровождается косой чертой. Двоеточие считается частью имени и каким-то образом искажается в нем. В Cygwin нет понятия относительного пути к тому или диску, нет понятия "текущий зарегистрированный диск" и нет текущего рабочего каталога для каждого диска.
  • the :
    • как собственный инструмент разработки Windows, Cygwin имеет некоторые причуды, такие как обработка пути, которая чужда Windows, зависимость от некоторых жестко закодированных путей, таких как /bin/sh и другие вопросы. Эти различия, что оказывает Программы Cygwin "неродные". Если программа принимает путь в качестве аргумента или ввода из диалогового окна, пользователи Windows ожидают, что этот путь будет работать так же, как и в других программах Windows. Если это не работает таким образом, это проблема.

    Plug: вскоре после объявления LGPL, я начал Cygnal (Cygwin Native Application Library) проект, чтобы обеспечить вилку библиотеки DLL Cygwin, которая направлена на устранение этих проблем. Программы могут быть разработан под Cygwin, а затем развернут с версией Cygnal cygwin1.dll без перекомпиляции. По мере улучшения этой библиотеки она будет постепенно устранять необходимость в MinGW.

    когда Cygnal решает проблему обработки пути, можно будет разработать один исполняемый файл, который работает с путями Windows при поставке в качестве приложения Windows с Cygnal и легко работает с путями Cygwin при установке в вашем /usr/bin под Cygwin. В Cygwin исполняемый файл будет прозрачно работать с таким путем, как /cygdrive/c/Users/bob. В собственном развертывании, где он связывается с версией Cygnal cygwin1.dll, этот путь не будет иметь никакого смысла, тогда как он поймет c:foo.txt.

Не забывайте и U / Win программное обеспечение, которое предназначено для компиляции приложений Unix на windows (последняя версия - 2012-08-06; использует Eclipse Public License, версия 1.0).

Как Cygwin они должны работать против библиотеки; в их случае POSIX.DLL. Ребята AT&T-потрясающие инженеры (та же группа, которая принесла вам ksh и точка) и их вещи стоит проверить.

Cygwin эмулирует всю среду POSIX, в то время как MinGW-это минимальный набор инструментов только для компиляции (компилирует собственное приложение Win.) Поэтому, если вы хотите сделать свой проект кросс-платформенным, выбор между ними очевиден, MinGW.

хотя вы можете рассмотреть возможность использования VS на Windows, GCC на Linux / Unices. Большинство проектов с открытым исходным кодом делают это (например, Firefox или Python).

чтобы использовать Cygwin в коммерческом / проприетарном / не-открытом приложении, вам нужно будет раскошелиться на десятки тысяч долларов за "лицензия котрые " от Красной шляпы; это делает недействительным стандартные условия лицензирования при значительных затратах. Google "стоимость лицензии cygwin" и посмотреть первые несколько результатов.

для mingw такие затраты не производятся, а лицензии (PD, BSD, MIT) чрезвычайно разрешительны. Самое большее ты мая ожидается поставка сведения о лицензии с вашим приложением, такие как лицензия winpthreads, необходимая при использовании mingw64-tdm.

редактировать благодаря Иззи Helianthus: коммерческая лицензия больше не доступна или не нужна, потому что библиотека API находится в подкаталоге winsup Cygwin сейчас распространяется под LGPL, в отличие от полного GPL.

обратите внимание, что поведение утилиты может действительно варьироваться между ними.

например, Cygwin tar может fork-потому что fork () поддерживается в DLL - где версия mingw не может. Это проблема при попытке скомпилировать mysql из исходного кода.

Cygwin предназначен для обеспечения более или менее полной среды POSIX для Windows, включая обширный набор инструментов, предназначенных для обеспечения полноценной Linux-подобной платформы. Для сравнения, MinGW и MSYS обеспечивают легкий, минималистский POSIX-подобный слой, используя только более важные инструменты, такие как gcc и bash доступен. Из-за более минималистского подхода MinGW он не обеспечивает степень покрытия POSIX API, которую предлагает Cygwin, и поэтому не может создавать определенные программы который в противном случае может быть скомпилирован на Cygwin.

С точки зрения кода, сгенерированного этими двумя, цепочка инструментов Cygwin опирается на динамическое связывание с большой библиотекой времени выполнения,cygwin1.dll, в то время как инструментальная цепочка MinGW компилирует код в двоичные файлы, которые динамически связываются с собственной библиотекой Windows C msvcrt.dll а также статически части glibc. Исполняемые файлы Cygwin поэтому более компактны, но требуют отдельной распространяемой DLL, в то время как двоичные файлы MinGW могут поставляться автономно, но, как правило, больше.

тот факт, что для запуска программ на базе Cygwin требуется отдельная библиотека DLL, также приводит к ограничениям лицензирования. Библиотека времени выполнения Cygwin лицензирована под GPLv3 с исключением связывания для приложений с OSI-совместимыми лицензиями, поэтому разработчики, желающие построить приложение с закрытым исходным кодом вокруг Cygwin, должны получить коммерческую лицензию от Red Hat. С другой стороны, код MinGW может использоваться как в приложениях с открытым, так и в приложениях с закрытым исходным кодом, так как заголовки и библиотеки разрешительная лицензия.

программа is-это Unix-подобная среда и интерфейс командной строки для Microsoft Windows.

Mingw является родным программным портом GNU Compiler Collection (GCC) для Microsoft Windows, а также набором свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. MinGW позволяет разработчикам создавать собственные приложения Microsoft Windows.

вы можете запускать двоичные файлы, созданные с помощью mingw без cygwin среда, при условии, что все необходимые библиотеки (DLL) присутствуют.

Cygwin используется слой совместимости, в то время как MinGW является родным. Это одно из главных отличий.