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

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

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

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++ компилятор и связанные с ним инструменты linking/make.

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


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


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

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

Если вы создадите что-то с Cygwin, любая система, в которую вы ее установите, также будет нуждаться в DLL(S) 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 and ...). Некоторые операционные системы пока не официально сертифицирован как совместимый с POSIX, соответствует в значительной степени (как Linux, FreeBSD, OpenSolaris and ...). Cygwin обеспечивает во многом POSIX-совместимая развития и среда выполнения для Microsoft Окна.


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

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

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


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

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

, потому что MinGW зависит от Windows API calls, он не может обеспечить полный POSIX API; он не может скомпилировать некоторые UNIX applications это может быть скомпилировано с Cygwin. В частности, это применяется к приложениям, которые требуют POSIX функции как fork(), mmap() или ioctl() и те, которые должны выполняться в 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 не понимается вообще как содержащий ссылка на букву диска, так как c: не сопровождается косой чертой. Двоеточие считается частью названия и как-то в него втиснуто. В Cygwin нет понятия относительного пути к тому или диску, нет концепции "текущего зарегистрированного диска" и текущего рабочего каталога для каждого диска.
  • the :
    • как собственный инструмент разработки Windows, Cygwin имеет некоторые причуды, такие как обработка пути, которая чужда Windows, зависимость от некоторых жестко закодированных путей, таких как /bin/sh и другие вопросы. Эти различия, что оказывает Программы Cygwin "неродные". Если программа принимает путь в качестве аргумента или ввода из диалогового окна, пользователи Windows ожидают, что этот путь будет работать так же, как и в других программах Windows. Если это не сработает, это проблема.

    штекер: вскоре после объявления LGPL, я начал Cygnal (Cygwin Native Application Library) проект, чтобы обеспечить вилку библиотеки Cygwin DLL, которая направлена на устранение этих проблем. Программы могут быть разработан под 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 в коммерческом / проприетарном / не-открытом приложении, вам нужно будет раскошелиться на десятки тысяч долларов за"лицензия котрые " от Red Hat; это делает недействительным стандартные условия лицензирования по значительной цене. Google "cygwin стоимость лицензии" и увидеть первые несколько результатов.

для mingw такие затраты не производятся, а лицензии (PD, BSD, MIT) являются чрезвычайно разрешительными. Самое большее-ты!--7-->мая ожидается поставка сведения о лицензии с приложением, такие как лицензия 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 он не обеспечивает степень охвата API POSIX Cygwin и поэтому не может создавать определенные программы который в противном случае может быть скомпилирован на Cygwin.

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

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


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

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

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


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