В чем разница между Cygwin и MinGW? - PullRequest
594 голосов
/ 21 апреля 2009

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

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

Ответы [ 16 ]

560 голосов
/ 27 апреля 2009

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

  • Скомпилируйте что-нибудь в Cygwin, и вы его компилируете для Cygwin .

  • Скомпилируйте что-нибудь в MinGW, и вы компилируете это для Windows .

О Cygwin

Цель Cygwin - значительно упростить перенос приложений на основе Unix на Windows, эмулируя многие мелкие детали, предоставляемые операционными системами на основе Unix, и документируются стандартами POSIX . Ваше приложение может использовать функцию Unix, такую ​​как каналы, доступ к файлам и каталогам в стиле Unix и т. Д., И его можно скомпилировать с Cygwin, который будет действовать как слой совместимости вокруг вашего приложения, так что многие из эти специфические для Unix парадигмы можно продолжать использовать.

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

О MinGW

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 framework был одним из самых популярных для этой цели, позволяя создавать графические приложения, работающие в операционных системах, включая Windows, но есть и другие варианты. Если вы используете такую ​​платформу с самого начала, вы можете не только уменьшить свои головные боли, когда приходит время портировать на другую платформу, но вы можете использовать одни и те же графические виджеты - окна, меню и элементы управления - на всех платформах, если вы пишете Приложение с графическим интерфейсом, и они должны отображаться для пользователя.

304 голосов
/ 21 апреля 2009

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

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

137 голосов
/ 27 апреля 2009

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

60 голосов
/ 21 апреля 2009

Википедия делает сравнение здесь .

С сайта Cygwin's :

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

с сайта Mingw :

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

45 голосов
/ 21 апреля 2009

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

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

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

40 голосов
/ 01 апреля 2011

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


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

Ответ № 1: Напишите ваш исходный код на ДЖАВА. Скомпилируйте исходный код один раз и запустить его где угодно.


Вопрос # 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 Окна.


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

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

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

25 голосов
/ 05 октября 2013

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

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() и те, которые ожидают запуска в 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.

23 голосов
/ 06 июля 2016

С точки зрения переноса программы на 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 будет возвращать очень ограниченную информацию - например, никаких полезных разрешений или номера inode.
  • путь 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 функции библиотеки будут работать по-разному:

  • функция stat обладает широкими функциональными возможностями, возвращая значимые значения в большинстве полей.
  • путь c:file.txt вообще не понимается как содержащий букву диска, так как c: не сопровождается косой чертой. Двоеточие считается частью имени и каким-то образом искажено. В Cygwin отсутствует концепция относительного пути к тому или диску, отсутствует концепция «текущий зарегистрированный диск» и текущий рабочий каталог для каждого диска.
  • функция system пытается использовать интерпретатор /bin/sh -c. Cygwin разрешит путь / в соответствии с расположением вашего исполняемого файла и ожидает, что программа sh.exe будет совмещена с вашим исполняемым файлом.

Как Cygwin, так и MinGW позволяют вам использовать функции Win32. Если вы хотите позвонить MessageBox или CreateProcess, вы можете сделать это. Вы также можете легко создать программу, для которой не требуется консольное окно, используя gcc -mwindows, под MinGW и Cygwin.

Cygwin не является строго POSIX. В дополнение к предоставлению доступа к API Windows, он также предоставляет свои собственные реализации некоторых функций 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 для управления консолью.

Тем не менее:

  • Как собственный инструмент разработки для Windows, у Cygwin есть некоторые особенности, такие как обработка путей, чуждая Windows, зависимость от некоторых жестко заданных путей, таких как /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. В нативном развертывании, где он ссылается на версию cygwin1.dll Cygnal, этот путь не будет иметь смысла, тогда как он будет понимать c:foo.txt.

14 голосов
/ 27 апреля 2009

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

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

10 голосов
/ 21 апреля 2009

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

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

...