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

447

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

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

Теги:
cygwin
mingw

15 ответов

275
Лучший ответ

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

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

  • 57
    Но если я хочу выпустить бесплатное программное обеспечение не-GPL? Извините, я не фанат GPL, вот и все.
  • 17
    @Dan Вам не нужно распространять среду выполнения, которую использует MinGW, - это часть Windows.
Показать ещё 5 комментариев
481

В качестве упрощения он выглядит следующим образом:

  • Скомпилируйте что-нибудь в 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-специфические функции, такие как упомянутые ранее. По умолчанию код, скомпилированный в MinGW GCC, будет скомпилирован с родной целью Windows X86, включая файлы .exe и .dll, хотя вы также можете перекрестно скомпилировать нужные настройки. MinGW - альтернатива open-source Microsoft Visual С++ и связанные с ней средства связывания/создания.

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

  • 26
    Bash, поставляемый с MinGW, не является родной программой для Windows. Это зависит от библиотеки MSYS, являющейся форком библиотеки Cygwin. То же самое для многих других утилит Unix, которые поставляются с MinGW / MSYS. MinGW gcc действительно является нативной программой. Make доступен как в родной, так и в MSYS версии.
  • 4
    какие-то различия в скорости?
Показать ещё 4 комментария
130

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

  • 30
    Это больше не работает с Cygwin 1.7.6. gcc: флаг -mno-cygwin удален; используйте кросс-компилятор, нацеленный на mingw.
  • 2
    @sigjuice: правда, но старый флаг -mno-cygwin все еще работает для GCC 3.x: gcc-3 -mno-cygwin
Показать ещё 6 комментариев
53

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

От Cygwin веб-сайт:

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

От Mingw веб-сайт:

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

38

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

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

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

35

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


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

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


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

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


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

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


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

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


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

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

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

  • 4
    О вашем маленьком faq: 1) Ваше право, если вам нужно что-то, что работает где-то и не нуждается в компиляции, выберите что-то вроде java (также не забудьте про python, perl, ruby и остальные языки сценариев) 2) Это несколько неправильно для случая C, так как все компиляторы C поддерживают его очень хорошо. 3) Вы все еще можете использовать Win32 API, но вы должны обернуть его в слой переносимости, так что это только проблема дизайна.
  • 1
    4) Это совершенно неправильно, из-за причин, которые я привел выше, поскольку POSIX - это только другие API, также, если вы защищаете столько POSIX, вы должны знать, что даже Unices не нужно реализовывать тот же набор POSIX, так как ты имеешь с этим дело? POSIX API в реальном времени приходит на ум. И это делает ваш вывод совершенно ложным и неправильным, потому что вам не нужен POSIX для чего-либо в Windows, вы можете просто использовать Win32 API. Или как вы думаете, что Qt, GTK и WxWidgets нашли способ быть кроссплатформенным, я думаю, что все они должны использовать Cygwin в Windows. -1 проголосуй за твой ответ.
Показать ещё 3 комментария
19

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

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.

  • 1
    Это определенно не «сложнее в установке и обслуживании» ! Используйте apt-cyg поскольку это возможно даже проще, чем использование apt под WSL.
14

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

#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 run-times). Примером этого является семейство функций spawn*, таких как spawnvp. Это хорошая идея использовать вместо fork и exec в Cygwin, поскольку они лучше отображают модель создания Windows, которая не имеет понятия fork.

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

  • Программы Cygwin не менее "родны", чем программы MS Visual C, по причине необходимости сопровождать библиотеки. Предполагается, что реализация языка программирования в Windows будет обеспечивать их собственную реализацию во время выполнения, даже на языке C. В Windows для "общего пользования" нет "libc".

  • Тот факт, что MinGW не требует сторонней DLL, на самом деле является недостатком; это зависит от недокументированной внутренней вилки Windows во время выполнения Visual C. MinGW делает это, потому что исключение системной библиотеки GPL относится к msvcrt.dll, что означает, что программы GPL-ed могут быть скомпилированы и перераспределены с помощью MinGW.

  • Благодаря своей более широкой и более глубокой поддержке POSIX по сравнению с msvcrt.dll, Cygwin на сегодняшний день является превосходной средой для переноса программ POSIX. Поскольку теперь он под LGPL, он позволяет перераспределять приложения со всеми видами лицензий, открытыми или закрытыми источниками. Cygwin даже содержит эмуляцию VT100 и termios, которые работают с консолью Microsoft! Приложение POSIX, которое устанавливает режим raw с tcsetattr и использует коды VT100 для управления курсором, будет работать прямо в окне cmd.exe. Что касается конечного пользователя, это собственное консольное приложение, создающее вызовы Win32 для управления консолью.

Однако:

  • В качестве встроенного средства разработки Windows Cygwin имеет некоторые причуды, такие как обработка пути, не зависящая от Windows, зависимость от некоторых жестко закодированных путей, таких как /bin/sh и другие проблемы. Эти различия - то, что делает программы Cygwin "неродными". Если программа принимает путь в качестве аргумента или ввод из диалогового окна, пользователи Windows ожидают, что этот путь будет работать так же, как в других программах Windows. Если это не работает, это проблема.

Plug: Вскоре после объявления 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.

  • 1
    Отличный ответ. Показ того, что происходит, когда один и тот же фрагмент кода компилируется, связывается и выполняется в каждой из трех сред, является ключевым и разъясняет различия.
  • 0
    @Kaz Как продвигается это развитие? Звук интересный, но кажется мертвым как минимум год назад. Почему вы не используете GitHub, чтобы люди могли помогать и участвовать?
Показать ещё 2 комментария
14

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

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

  • 4
    Вау, это плохие веб-страницы. Я наконец-то смог найти ссылку для скачивания на www2.research.att.com/sw/download , но никакой онлайн-документации или информации о проекте.
  • 1
    Хотя эта информация полезна, я считаю, что это может быть ответ на вопрос об альтернативах для MingW или Cygwin, а не на этот вопрос.
9

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

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

  • 0
    Слово «большинство» здесь выглядит как бессмысленное ласка, особенно с двумя примерами и без статистики. Я подозреваю, что во многих проектах FOSS в качестве файла жестов используется файл проекта VS. Но если прошлому опыту нужно что-то пройти, GCC или Clang обычно безопаснее, поскольку VS имеет тенденцию значительно отставать по мере развития языковых стандартов.
  • 0
    Это ответ 2009 года. В настоящее время дела GCC выглядят еще более безрадостными. Что касается «большинства», если вы измеряете по степени влияния, то только у Firefox и Chrome больше пользователей, чем у кого-либо еще.
Показать ещё 1 комментарий
8

Чтобы использовать Cygwin в коммерческом/проприетарном/не-open-source приложении, вам нужно разложить десятки тысяч долларов на " лицензионный выкуп из Red Hat; это приводит к недействительности стандартных условий лицензирования за значительную стоимость. Google" Стоимость лицензии cygwin" и увидеть первые несколько результатов.

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

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

  • 1
    Обновление с сайта Redhat (ссылка с «выкупа лицензии» - «С 1 марта 2016 года Red Hat больше не продает коммерческую лицензию на выкуп для Cygwin. Коммерческая лицензия больше не нужна, поскольку Cygwin теперь распространяется в рамках GNU Lesser»). GPL (LGPL). '> С веб-сайта Cygwin. Библиотека API Cygwin ™, найденная в подкаталоге winsup исходного кода, подпадает под действие GNU Lesser General Public License (LGPL) версии 3. или более поздней. Для получения подробной информации о требованиях LGPLv3, пожалуйста, ознакомьтесь с GNU Lesser General Public License (LGPL).
8

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

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

  • 0
    Вот почему в полноценных средах с поддержкой MinGW, например, MSYS2, предлагается Cygwin или другой полностью POSIX-совместимый слой для низкоуровневых гаек и болтов наборов инструментов, необходимых во время сборки. Затем фактическая компиляция и компоновка оставляются на усмотрение полностью собственного компилятора MinGW. MSYS2 действительно опрятен.
6

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

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

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

3

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

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

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

2

Cygwin использует уровень совместимости, в то время как MinGW является родным. В этом разница.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню