Я хочу сделать свою кросс-платформу для проектов на С++, и я рассматриваю возможность использования Cygwin/MinGW. Но в чем разница между ними?
Другой вопрос: смогу ли я запустить двоичный файл в системе без Cygwin/MinGW?
Cygwin - это попытка создать полную среду UNIX/POSIX в Windows. Для этого используются различные библиотеки DLL. Хотя эти библиотеки DLL защищены GPLv3 +, их лицензия содержит исключение, которое не заставляет производную работу покрывать GPLv3+. MinGW - это компилятор C/С++, который позволяет создавать исполняемые файлы Windows без зависимости от таких DLL - вам нужны только обычные среды MSVC, которые являются частью любой обычной установки Microsoft Windows.
Вы также можете получить небольшую среду UNIX/POSIX, скомпилированную с помощью MinGW под названием MSYS. Он не имеет нигде рядом со всеми функциями Cygwin, но идеально подходит для программистов, желающих использовать MinGW.
В качестве упрощения он выглядит следующим образом:
Скомпилируйте что-нибудь в 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.
Чтобы добавить к другим ответам, Cygwin поставляется с библиотеками и заголовками MinGW, и вы можете скомпилировать их без ссылки на cygwin1.dll с помощью флага -mno-cygwin с gcc. Я очень предпочитаю это использовать простые MinGW и MSYS.
gcc-3 -mno-cygwin
Википедия делает сравнение здесь.
От Cygwin веб-сайт:
- Cygwin - это Linux-подобная среда для Windows. Он состоит из двух частей: DLL (cygwin1.dll), который действует как уровень эмуляции Linux API, обеспечивающий существенные функциональные возможности Linux API.
- Коллекция инструментов, которые обеспечивают интерфейс Linux.
От Mingw веб-сайт:
MinGW ( "Минималистическое GNU для Windows" ) представляет собой набор свободно доступных и свободно распространяемых файлов заголовков Windows и импортирует библиотеки в сочетании с инструментами GNU, которые позволяют создавать собственные программы Windows, которые не полагаются на сторонние C runtime DLL
Cygwin использует DLL, cygwin.dll(или, возможно, набор DLL), чтобы обеспечить POSIX-подобную среду выполнения в Windows.
MinGW компилируется в собственное приложение Win32.
Если вы создаете что-то с Cygwin, любой системе, в которую вы ее установите, также понадобятся библиотеки Cygwin. Приложение MinGW не требует специального времени выполнения.
Прочтите эти ответы на вопросы, чтобы понять разницу между 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.
Таким образом:
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
.
apt-cyg
поскольку это возможно даже проще, чем использование apt под WSL.
С точки зрения переноса программы на С, хороший способ понять это - взять пример:
#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 для управления консолью.
Однако:
/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
.
Не забывайте, что AT & T U/Win программное обеспечение, предназначенное для компиляции Unix приложения в Windows (последняя версия - 2012-08-06; использует общедоступную лицензию Eclipse, версия 1.0).
Как и Cygwin, они должны бежать против библиотеки; в их случае POSIX.DLL
. Парни AT & T - потрясающие инженеры (одна группа, которая принесла вам ksh и dot), и их материал стоит проверить.
Cygwin эмулирует всю среду POSIX, в то время как MinGW - это минимальный набор инструментов для компиляции (компилирует собственное приложение Win). Поэтому, если вы хотите сделать свою кросс-платформу, выбор между ними очевиден, MinGW.
Хотя вы можете использовать VS на Windows, GCC на Linux/Unices. Большинство проектов с открытым исходным кодом делают это (например, Firefox или Python).
Чтобы использовать Cygwin в коммерческом/проприетарном/не-open-source приложении, вам нужно разложить десятки тысяч долларов на " лицензионный выкуп из Red Hat; это приводит к недействительности стандартных условий лицензирования за значительную стоимость. Google" Стоимость лицензии cygwin" и увидеть первые несколько результатов.
Для mingw таких затрат не требуется, а лицензии (PD, BSD, MIT) являются чрезвычайно разрешительными. В большинстве случаев вам может потребоваться предоставить данные о лицензии в вашем приложении, например, лицензию winpthreads, необходимую при использовании mingw64-tdm.
EDIT благодаря Izzy Helianthus: Коммерческая лицензия больше не доступна или необходима, потому что библиотека API найдена в подкаталоге winsup Cygwin теперь распространяется под LGPL, в отличие от полного GPL.
Обратите внимание, что поведение полезности может действительно измениться между ними.
Например, Cygwin tar может fork - потому что fork() поддерживается в DLL - там, где версия mingw не может. Это проблема при попытке скомпилировать mysql из источника.
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 может использоваться как в приложениях с открытым исходным кодом, так и в приложениях с закрытым исходным кодом, поскольку заголовки и библиотеки разрешимо лицензированы.
Cygwin - это Unix-подобный интерфейс и интерфейс командной строки для Microsoft Windows.
Mingw - это собственный программный порт GNU Compiler Collection (GCC) для Microsoft Windows, а также набор свободно распространяемых импортировать библиотеки и файлы заголовков для Windows API. MinGW позволяет разработчикам создавать собственные приложения Microsoft Windows.
Вы можете запускать исполняемые файлы с mingw
без среды cygwin
при условии наличия всех необходимых библиотек (DLL).
Cygwin использует уровень совместимости, в то время как MinGW является родным. В этом разница.