Я хочу сделать свой C ++ проект кроссплатформенным, и я собираюсь использовать Cygwin / MinGW. Но в чем разница между ними?
Другой вопрос, смогу ли я запустить бинарный файл в системе без Cygwin / MinGW?
Для упрощения это выглядит так:
Скомпилируйте что-нибудь в 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 :
С сайта Mingw :
источник
Cygwin использует DLL, cygwin.dll (или, возможно, набор DLL) для обеспечения POSIX-подобной среды выполнения в Windows.
MinGW компилируется в собственное приложение Win32.
Если вы создаете что-то с помощью Cygwin, любая система, на которую вы его устанавливаете, также будет нуждаться в DLL (ах) Cygwin. Приложение MinGW не требует специальной среды выполнения.
источник
Прочитайте эти ответы на вопросы, чтобы понять разницу между Cygwin и MinGW.
Вопрос № 1: я хочу создать приложение, которое напишу исходный код один раз, скомпилировать его один раз и запустить на любых платформах (например, Windows, Linux и Mac OS X…).
Вопрос № 2: я хочу создать приложение, которое я пишу исходный код один раз, но нет никаких проблем с тем, что я компилирую исходный код для любых платформ отдельно (например, Windows, Linux и Mac OS X…).
Вопрос № 3: В ответе на вопрос № 2 трудно использовать разные компиляторы для каждой платформы, есть ли кроссплатформенный компилятор?
Вопрос № 4: стандартные заголовочные файлы C или C ++ не предоставляют никаких дополнительных функций программирования, таких как многопоточность. Что я могу сделать?
Таким образом:
Чтобы использовать преимущества кроссплатформенного компилятора GCC в Windows, используйте MinGW.
Чтобы использовать преимущества стандартных расширенных функций программирования POSIX и инструментов в Windows, используйте Cygwin.
источник
С точки зрения переноса программы на C, хороший способ понять это - взять пример:
Если мы изменим
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
. В нативном развертывании, где он ссылается на версию Cygnalcygwin1.dll
, этот путь не будет иметь смысла, тогда как он пойметc:foo.txt
.источник
Википедия говорит :
источник
apt-cyg
это, возможно, даже проще, чем использовать apt под WSL.Не забывайте о программном обеспечении 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
является родным. Это одно из главных отличий.источник