Ответы:
Для упрощения это выглядит так:
Скомпилируйте что-нибудь в Cygwin, и вы скомпилируете это для Cygwin .
Скомпилируйте что-нибудь в MinGW, и вы скомпилируете это для Windows .
О Cygwin
Цель Cygwin - значительно упростить перенос приложений на основе Unix в Windows, эмулируя многие мелкие детали, которые предоставляют операционные системы на основе Unix, и документированные стандартами POSIX . Ваше приложение может использовать функцию Unix, такую как каналы, доступ к файлам и каталогам в стиле Unix и т. Д., И его можно скомпилировать с помощью Cygwin, который будет действовать как слой совместимости вокруг вашего приложения, так что многие из этих специфических для Unix парадигм могут продолжать использоваться.
Когда вы распространяете свое программное обеспечение, получателю необходимо будет запустить его вместе со средой выполнения Cygwin (предоставленной файлом cygwin1.dll
). Вы можете распространять это вместе с вашим программным обеспечением, но ваше программное обеспечение должно соответствовать его лицензии с открытым исходным кодом. Может даже случиться, что даже связывание вашего программного обеспечения с ним, но раздельное распространение dll может потребовать от вас соблюдения лицензии на открытый исходный код.
О МинГВ
MinGW стремится быть просто портом Windows инструментов компилятора GNU, таких как GCC, Make, Bash и так далее. Он не пытается эмулировать или обеспечивать всестороннюю совместимость с Unix, но вместо этого он обеспечивает минимально необходимую среду для использования GCC (компилятор GNU) и небольшое количество других инструментов в Windows, Он не имеет слоя эмуляции Unix, такого как Cygwin, но в результате ваше приложение должно быть специально запрограммировано для запуска в Windows, что может означать значительные изменения, если оно было создано, чтобы полагаться на работу в стандартной среде Unix и использует специфичные для Unix функции, такие как упомянутые ранее. По умолчанию код, скомпилированный в GCC MinGW, будет компилироваться в собственную цель Windows X86, включая файлы .exe и .dll, хотя вы также можете выполнять кросс-компиляцию с правильными настройками, поскольку вы в основном используете набор инструментов компилятора GNU.
MinGW по сути является альтернативой компилятору Microsoft Visual C ++ и связанным с ним инструментам компоновки / создания. В некоторых случаях может быть возможно использовать MinGW для компиляции чего-либо, предназначенного для компиляции с Microsoft Visual C ++, с нужными библиотеками, а в некоторых случаях с другими модификациями.
MinGW включает в себя некоторые базовые стандартные библиотеки для взаимодействия с операционной системой Windows, но, как и в случае стандартных стандартных библиотек, включенных в коллекцию компиляторов GNU, они не накладывают лицензионных ограничений на созданное вами программное обеспечение.
Для нетривиальных программных приложений сделать их кроссплатформенными может быть серьезной проблемой, если вы не используете всеобъемлющую кроссплатформенную среду. В то время, когда я писал это, среда Qt была одной из самых популярных для этой цели, позволяя создавать графические приложения, работающие в операционных системах, включая Windows, но есть и другие варианты. Если вы используете такую платформу с самого начала, вы можете не только уменьшить свои головные боли, когда приходит время портировать на другую платформу, но вы можете использовать одни и те же графические виджеты - окна, меню и элементы управления - на всех платформах, если вы пишете Приложение с графическим интерфейсом, и они должны быть родными для пользователя.
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.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
пакет Cygwin. MinGW-64 будет доступен в виде команды с неуклюжим именем x86_64-w64-mingw32-gcc
. Пожалуйста, Бог (ы), кто-то уже объединяет имена этих кровавых вещей.
Википедия делает сравнение здесь .
С сайта Cygwin :
- Cygwin - это Linux-подобная среда для Windows. Он состоит из двух частей: DLL (cygwin1.dll), которая действует как уровень эмуляции API Linux, обеспечивая существенную функциональность API Linux.
- Коллекция инструментов, обеспечивающих внешний вид Linux.
С сайта Mingw :
MinGW («Минималистичный GNU для Windows») - это коллекция свободно доступных и свободно распространяемых специфических для Windows заголовочных файлов и библиотек импорта в сочетании с наборами инструментов GNU, позволяющими создавать собственные программы Windows, которые не зависят от сторонних DLL-библиотек времени выполнения C
Cygwin использует DLL, cygwin.dll (или, возможно, набор DLL) для обеспечения POSIX-подобной среды выполнения в Windows.
MinGW компилируется в собственное приложение Win32.
Если вы создаете что-то с помощью Cygwin, любая система, на которую вы его устанавливаете, также будет нуждаться в DLL (ах) Cygwin. Приложение MinGW не требует специальной среды выполнения.
Прочитайте эти ответы на вопросы, чтобы понять разницу между Cygwin и MinGW.
Вопрос № 1: я хочу создать приложение, которое напишу исходный код один раз, скомпилировать его один раз и запустить на любых платформах (например, Windows, Linux и Mac OS X…).
Ответ № 1: Напишите ваш исходный код на JAVA. Скомпилируйте исходный код один раз и запустите его где угодно.
Вопрос № 2: я хочу создать приложение, которое я пишу исходный код один раз, но нет никаких проблем с тем, что я компилирую исходный код для любых платформ отдельно (например, Windows, Linux и Mac OS X…).
Ответ № 2: Напишите ваш исходный код на C или C ++. Используйте только стандартные заголовочные файлы. Используйте подходящий компилятор для любой платформы (например, Visual Studio для Windows, GCC для Linux и XCode для Mac). Обратите внимание, что вам не следует использовать какие-либо расширенные функции программирования для успешной компиляции исходного кода на всех платформах. Если вы не используете стандартные классы или функции 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, OpenSolaris и ...). Cygwin предоставляет POSIX-совместимую среду разработки и среды выполнения для Microsoft Windows.
Таким образом:
С точки зрения переноса программы на 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
на _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.
В обоих случаях программа будет иметь похожее поведение:
stat
функция будет возвращать очень ограниченной информации нет полезных разрешений или номер индексного дескриптора, например.c:file.txt
определяется в соответствии с текущим рабочим каталогом, связанным с диском c:
.system
использует cmd.exe /c
для запуска внешней команды.Мы также можем скомпилировать программу под Cygwin. Аналогично распространяемой среде выполнения, используемой MS Visual C, программа Cygwin будет связана с библиотеками времени выполнения cygwin1.dll
Cygwin : (собственно Cygwin) и cyggcc_s-1.dll
(поддержка времени выполнения GCC). Поскольку Cygwin теперь находится под LGPL, мы можем упаковать нашу программу, даже если она не совместима с GPL, и отправить ее.
Под Cygwin функции библиотеки будут вести себя по-другому:
stat
функция имеет богатую функциональность, возвращая значимые значения в большинстве областей.c:file.txt
вообще не понимается как содержащий букву диска, так c:
как за ним не следует косая черта. Двоеточие считается частью имени и каким-то образом искажено. В Cygwin нет концепции относительного пути к тому или диску, нет концепции «текущего зарегистрированного диска» и текущего рабочего каталога для каждого диска.system
функция пытается использовать /bin/sh -c
интерпретатор. Cygwin определит /
путь в соответствии с расположением вашего исполняемого файла и ожидает, что sh.exe
программа будет размещена вместе с вашим исполняемым файлом.И Cygwin, и MinGW позволяют использовать функции Win32. Если вы хотите позвонить MessageBox
или CreateProcess
, вы можете сделать это. Вы также можете легко создать программу, которая не требует окна консоли, используя gcc -mwindows
, под MinGW и Cygwin.
Cygwin не является строго POSIX. Помимо предоставления доступа к Windows API, он также предоставляет свои собственные реализации некоторых функций Microsoft C (вещи, найденные в msvcrt.dll
или распространяемые msvcrtnn.dll
во время выполнения). Примером этого является spawn*
семейство функций, таких как spawnvp
. Это хорошая идея, чтобы использовать вместо fork
и exec
на Cygwin, так как они лучше соответствуют модели создания процессов Windows, которая не имеет понятия fork
.
Таким образом:
Программы Cygwin не менее «родные», чем программы MS Visual C, по причине необходимости сопровождения библиотек. Ожидается, что реализации на языке программирования в Windows будут иметь свои собственные реализации, даже на языке Си. В Windows нет "libc" для публичного использования.
Тот факт, что MinGW не требует сторонних DLL, на самом деле является недостатком; это зависит от недокументированного внутреннего Windows-форка среды выполнения Visual C. MinGW делает это потому, что применяется исключение системной библиотеки GPL msvcrt.dll
, что означает, что программы под GPL могут быть скомпилированы и распространены с MinGW.
Благодаря гораздо более широкой и глубокой поддержке POSIX по сравнению с msvcrt.dll
Cygwin, безусловно, является превосходной средой для переноса программ POSIX. Поскольку сейчас он находится под лицензией LGPL, он позволяет распространять приложения со всеми видами лицензий с открытым или закрытым исходным кодом. Cygwin даже содержит эмуляцию VT100 и termios
, которые работают с консолью Microsoft! Приложение POSIX, которое устанавливает сырой режим tcsetattr
и использует коды VT100 для управления курсором, будет работать прямо в cmd.exe
окне. Что касается конечного пользователя, то это собственное консольное приложение, которое выполняет вызовы Win32 для управления консолью.
Однако:
/bin/sh
и другие проблемы. Именно эти различия делают программы Cygwin «неродными». Если программа принимает путь в качестве аргумента или ввод из диалогового окна, пользователи Windows ожидают, что этот путь будет работать так же, как и в других программах Windows. Если это не сработает, это проблема.Plug: Вскоре после анонса LGPL я запустил проект Cygnal (библиотека собственных приложений Cygwin), чтобы предоставить развилку 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
.
MinGW
от версии 1.3.3Cygwin
. Хотя оба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()
тем, которые ожидают запуска в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
. Это означает, что разработчикам не требуется установка WindowsMSYS
для компиляции программного обеспечения, которое будет работатьWindows
без негоCygwin
.
Не забывайте о программном обеспечении AT & T U / Win , предназначенном для компиляции приложений Unix для Windows (последняя версия - 2012-08-06; используется Eclipse Public License, версия 1.0).
Как и Cygwin, они должны бежать против библиотеки; в их случае POSIX.DLL
. Ребята из AT & T - потрясающие инженеры (та же группа, которая принесла вам ksh и dot ), и их вещи стоит проверить.
Cygwin эмулирует всю среду POSIX, в то время как MinGW - минимальный набор инструментов только для компиляции (компилирует нативное приложение Win). Поэтому, если вы хотите сделать свой проект кросс-платформенным, выбор между ними очевиден, MinGW.
Хотя вы можете рассмотреть возможность использования VS в Windows, GCC в Linux / Unices. Большинство проектов с открытым исходным кодом делают это (например, Firefox или Python).
clang
это жизнеспособное кроссплатформенное решение.
Обратите внимание, что поведение утилиты может действительно отличаться между двумя.
Например, Cygwin tar может разветвляться - потому что fork () поддерживается в DLL - где не может версия mingw. Это проблема при попытке скомпилировать MySQL из исходного кода.
Чтобы использовать Cygwin в коммерческом / проприетарном / не с открытым исходным кодом приложении, вам нужно раскошелиться на десятки тысяч долларов для « выкупа лицензии » у Red Hat; это делает недействительными стандартные условия лицензирования при значительных затратах. Google "стоимость лицензии Cygwin" и увидеть первые результаты.
Для mingw такие затраты не производятся, а лицензии (PD, BSD, MIT) крайне разрешительные. Максимум от вас может потребоваться предоставить сведения о лицензии вместе с вашим приложением, такие как лицензия winpthreads, требуемая при использовании mingw64-tdm.
РЕДАКТИРОВАТЬ благодаря Иззи Хелиантузу: коммерческая лицензия больше не доступна или не нужна, поскольку библиотека API, находящаяся в подкаталоге winsup Cygwin , теперь распространяется в рамках LGPL, в отличие от полной лицензии GPL.
Cygwin предназначен для предоставления более или менее полной POSIX-среды для Windows, включая обширный набор инструментов, предназначенных для обеспечения полноценной Linux-подобной платформы. Для сравнения, MinGW и MSYS предоставляют легкий, минималистичный POSIX-подобный слой, содержащий только более важные инструменты, такие как gcc
и bash
доступные. Из-за более минималистского подхода MinGW он не обеспечивает степень охвата API POSIX, которую предлагает Cygwin, и поэтому не может создавать определенные программы, которые в противном случае могут быть скомпилированы на Cygwin.
С точки зрения кода, сгенерированного двумя, цепочка инструментов Cygwin опирается на динамическое связывание с большой библиотекой времени выполнения cygwin1.dll
, в то время как цепочка инструментов MinGW компилирует код в двоичные файлы, которые динамически связываются с собственной библиотекой C Windows, msvcrt.dll
а также статически с частями glibc
. Таким образом, исполняемые файлы Cygwin более компактны, но для них требуется отдельная распространяемая библиотека DLL, тогда как двоичные файлы MinGW могут поставляться отдельно, но, как правило, они больше.
Тот факт, что для программ на базе Cygwin требуется отдельная DLL, также приводит к лицензионным ограничениям. Библиотека времени выполнения Cygwin лицензируется по GPLv3, за исключением связывания для приложений с лицензиями, совместимыми с OSI, поэтому разработчики, желающие создать приложение с закрытым исходным кодом на основе Cygwin, должны приобрести коммерческую лицензию в Red Hat. С другой стороны, код MinGW может использоваться как в приложениях с открытым исходным кодом, так и в приложениях с закрытым исходным кодом, так как заголовки и библиотеки разрешительно лицензированы.
Cygwin - это Unix-подобная среда и интерфейс командной строки для Microsoft Windows.
Mingw - это собственный программный порт из коллекции компиляторов GNU (GCC) для Microsoft Windows, а также набор свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. MinGW позволяет разработчикам создавать собственные приложения Microsoft Windows.
Вы можете запускать двоичные файлы, созданные mingw
без cygwin
среды, при условии наличия всех необходимых библиотек (DLL).
Cygwin
использует уровень совместимости, пока MinGW
является родным. Это одно из главных отличий.