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

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

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

Ответ 1

Как упрощение, это так:

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

MinGW по сути является альтернативой компилятору Microsoft Visual C++ и связанным с ним инструментам компоновки/создания. В некоторых случаях может быть возможно использовать MinGW для компиляции чего-либо, предназначенного для компиляции с Microsoft Visual C++, с нужными библиотеками, а в некоторых случаях с другими модификациями.

MinGW включает в себя некоторые базовые стандартные библиотеки для взаимодействия с операционной системой Windows, но, как и в случае стандартных стандартных библиотек, включенных в коллекцию компиляторов GNU, они не накладывают лицензионных ограничений на созданное вами программное обеспечение.

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

Прочтите эти ответы на вопросы, чтобы понять разницу между 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.

Ответ 7

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

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.

Ответ 8

С точки зрения переноса программы на 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 -c бесплатное программное обеспечение, и отгрузить программу.

Под Cygwin функции библиотеки будут вести себя по-другому:

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

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

Cygwin не является строго POSIX. В дополнение к предоставлению доступа к Windows API, он также предоставляет свои собственные реализации некоторых функций Microsoft C (вещи, найденные в msvcrt.dll или распространяемые msvcrtnn.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, которое устанавливает режим raw с помощью tcsetattr и использует коды VT100 для управления курсором, будет работать прямо в окне cmd.exe. Что касается конечного пользователя, то это нативное консольное приложение, выполняющее вызовы Win32 для управления консолью.

Тем не мение:

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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 может использоваться как в приложениях с открытым исходным кодом, так и в приложениях с закрытым исходным кодом, поскольку заголовки и библиотеки разрешимо лицензированы.

Ответ 14

Другие ответы уже попали в цель. Я просто хочу добавить иллюстрацию для быстрого улова.

enter image description here

Ответ 15

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

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

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

Ответ 16

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