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

658

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

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

Лукаш Лью
источник

Ответы:

629

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

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

thomasrutter
источник
43
Bash, который поставляется с MinGW, не является родной программой Windows. Это зависит от библиотеки MSYS, которая является форком библиотеки Cygwin. То же самое для многих других утилит Unix, которые поставляются с MinGW / MSYS. MinGW gcc действительно является нативной программой. Make доступен как в родной, так и в MSYS версии.
ak2
6
какие-то различия в скорости?
EKanadily
6
Разница в скорости будет игнорироваться в большинстве ситуаций. Любая разница сводится к тому, насколько дополнительный уровень абстракции, предоставляемый уровнем совместимости cygwin, замедляет работу. Это может оказать ощутимое влияние на такие вещи, как ввод / вывод. Например, давным-давно Git работал только на Windows в Cygwin, и из-за этого он работал немного медленнее. Опять же, если вы кодируете с использованием фреймворка, это также уровень абстракции с потенциалом замедления некоторых вещей в любом случае.
Томасруттер
28
Я должен отметить, что код, скомпилированный для cygwin, все еще является нативным кодом - он не должен запускаться через интерпретатор, такой как, скажем, Java. Просто когда ему нужно взаимодействовать с определенными функциями ОС, такими как диск / файл, он проходит через другой уровень.
Томасруттер
4
В общем, вы не сможете сравнивать, потому что вы должны писать свой код по-разному, в зависимости от того, предназначен ли он для Cygwin или нет. Хотя для любого небольшого, простого программного обеспечения, такого как «hello world», эквивалент Cygwin будет больше только благодаря библиотеке времени выполнения Cygwin. Если вы не учитываете размер библиотеки времени выполнения cygwin, то версия cygwin обычно будет меньше, но я считаю, что это неверная цифра, поскольку библиотека практически всегда должна поставляться с программным обеспечением. Тем не менее, если вы используете какие-либо нетривиальные библиотеки / фреймворки, то это будет зависеть больше от этого.
Томасруттер
311

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

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

Коул Джонсон
источник
59
Но если я хочу выпустить бесплатное программное обеспечение не-GPL? Извините, я не фанат GPL, вот и все.
19
@Dan Вам не нужно распространять среду выполнения, которую использует MinGW - это часть Windows.
14
@ ak2: это правда, но вводит в заблуждение. cygwyn gcc + cygwin по умолчанию создает двоичные файлы, связанные с (GPL) cygwin dll. По умолчанию mingw + msys создает двоичные файлы, связанные с платформой C lib.
Шон Макмиллан
4
@DanMoulding Если вы не фанат Microsoft, вам придется игнорировать эти чувства, прежде всего, для Windows. ;-)
Арда Си
14
@anon «Но если я хочу выпустить бесплатное программное обеспечение не-GPL?» .. cygwin имеет специальное исключение в условиях лицензирования, которое позволяет вам распространять бесплатное программное обеспечение, связанное с ним, по другим (не GPL) лицензиям с открытым исходным кодом. См. «Исключение в отношении лицензирования с открытым исходным кодом» здесь: cygwin.com/licensing.html
Стив
138

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

TrayMan
источник
31
Это больше не работает с Cygwin 1.7.6. gcc: флаг -mno-cygwin удален; используйте кросс-компилятор, ориентированный на mingw.
sigjuice
2
@sigjuice: правда, но старый флаг -mno-cygwin все еще работает для GCC 3.x:gcc-3 -mno-cygwin
Amro
1
Значит ли это, что мне нужно скачать библиотеки mingw с официального сайта mingw, чтобы скомпилировать их с mgw с хоста cygwin? Или эти библиотеки можно загрузить из системы пакетов Cygwin?
CMCDragonkai
5
@CMCDragonkai Вы можете приобрести mingw-совместимые компиляторы на сайте Cygwin, запустив утилиту установки, найдя и отметив их. Таким образом, даже если gcc больше не генерирует mingw-совместимый код, в Cygwin можно запустить mingw-gcc (это не полное имя), чтобы сделать исполняемый файл того же типа, что и компилятор mingw в msys.
Кардифф космонавт
9
Чтобы исправить полезный ответ Кардиффа, пакеты и команды Cygwin MinGW имеют несколько неясные названия. Чтобы установить MinGW-64 ( почти всегда то, что вы хотите в наши дни ), установите mingw64-x86_64-gcc-coreпакет Cygwin. MinGW-64 будет доступен в виде команды с неуклюжим именем x86_64-w64-mingw32-gcc. Пожалуйста, Бог (ы), кто-то уже объединяет имена этих кровавых вещей.
Сесил Карри
60

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

С сайта Cygwin :

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

С сайта Mingw :

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

dirkgently
источник
47

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

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

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

Майкл Берр
источник
42

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


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

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


Вопрос № 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 Windows.


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

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

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

Амир Саниян
источник
4
О вашем маленьком faq: 1) Ваше право, если вам нужно что-то, что работает где-то и не нуждается в компиляции, выберите что-то вроде java (также не забудьте про python, perl, ruby ​​и остальные языки сценариев) 2) Это несколько неправильно для случая C, поскольку все компиляторы C поддерживают его очень хорошо. 3) Вы все еще можете использовать Win32 API, но вы должны обернуть его в слой переносимости, так что это только проблема дизайна.
Coyote21
1
4) Это совершенно неправильно, из-за причин, которые я привел выше, поскольку POSIX - это только другие API, также, если вы защищаете столько POSIX, вы должны знать, что даже Unices не нужно реализовывать тот же набор POSIX, так как ты имеешь с этим дело? POSIX API реального времени приходит на ум. И это делает ваш вывод совершенно ложным и неправильным, потому что вам не нужен POSIX для чего-либо в Windows, вы можете просто использовать Win32 API. Или как вы думаете, что Qt, GTK и WxWidgets нашли способ быть кроссплатформенным, я думаю, что все они должны использовать Cygwin в Windows. -1 проголосуй за твой ответ.
Coyote21
4
Я не понимаю ваш аргумент, @ Coyote21. Вы говорите, что POSIX не подходит для кроссплатформенной разработки? Вы хотите сказать, что единственный подходящий способ написания кода на C / C ++ для нескольких платформ - это написать собственный уровень совместимости для каждой платформы, которую вы хотите поддерживать? Я не вижу ничего плохого в предложении начать с POSIX. Вам нужно посмотреть, как далеко вы можете зайти, и потребуется ли для этого обширное решение для уровня совместимости. Большие уровни совместимости не являются нормой. Сказать иначе - значит утверждать, что POSIX - полный провал.
Дэвид Гладфелтер
Многопоточность реализуется через слой POSIX даже в MinGW.
Александр Шишенко
1
«Вы не должны использовать какие-либо расширенные функции программирования для успешной компиляции исходного кода на всех платформах». Вам действительно нужно уточнить, что вы имели в виду под «продвинутыми функциями программирования». Исходя из более поздней строки, я предполагаю, что вы на самом деле имеете в виду специфичные для платформы функции. Если вы имели в виду возможности современного языка, то нет, потому что существуют компетентные компиляторы для «всех [основных] платформ», и мы не должны лишать себя возможностей просто для поддержки тех, чьи компиляторы или библиотеки все еще отстают. С достойным компилятором, стандартным C / ++ и кроссплатформенными библиотеками мы можем быть достаточно продвинутыми.
underscore_d
34

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

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

Kaz
источник
2
Отличный ответ. Показ того, что происходит, когда один и тот же фрагмент кода компилируется, связывается и выполняется в каждой из трех сред, является ключевым и разъясняет различия.
drlolly
@Kaz Как продвигается это развитие? Звук интересный, но кажется мертвым как минимум год назад. Почему вы не используете GitHub, чтобы люди могли помогать и участвовать?
not2qubit
2
@ not2qubit Я чувствую, что могу лучше контролировать свои проекты, когда они размещаются на моем собственном сервере, которым я сам управляю. Я использую git; хранилище можно вытащить. Я могу принимать запросы по запросу по электронной почте (как их разработал Линус Торвальдс). Я также могу предоставить учетную запись с привилегиями коммитов тому, кто станет участником уровня сопровождающего. Лебедя работает нормально; Я регулярно включаю его в версии Windows новых выпусков языка TXR. Я перенесу Cygnal на более новую базовую версию Cygwin где-то в начале 2019 года.
Kaz
@ not2qubit Обратите внимание, что все 17 вопросов повестки дня Cygnal соответствуют указанным. Никто не предложил никаких новых требований и не жаловался на то, как обрабатываются эти 17. поэтому нет необходимости в разработке, кроме перебазирования на более новый Cygwin, что не так уж необходимо.
Каз
27

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

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.

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

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

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

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

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

введите описание изображения здесь

smwikipedia
источник
11

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

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

Vartec
источник
Слово «большинство» здесь выглядит как бессмысленное ласка, особенно с двумя примерами и без статистики. Я подозреваю, что во многих проектах FOSS в качестве файла жестов используется файл проекта VS. Но если прошлому опыту нужно что-то пройти, GCC или Clang обычно безопаснее, так как VS имеет тенденцию значительно отставать по мере развития языковых стандартов.
underscore_d
Это ответ 2009 года. В настоящее время дела GCC выглядят еще более безрадостными. Что касается «большинства», если вы измеряете по степени влияния, то только у Firefox и Chrome больше пользователей, чем у кого-либо еще.
vartec
2
Что изменилось с тех пор, как я ответил, так это то, что теперь clangэто жизнеспособное кроссплатформенное решение.
vartec
9

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

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


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

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

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

РЕДАКТИРОВАТЬ благодаря Иззи Хелиантузу: коммерческая лицензия больше не доступна или не нужна, поскольку библиотека API, находящаяся в подкаталоге winsup Cygwin , теперь распространяется в рамках LGPL, в отличие от полной лицензии GPL.

инженер
источник
2
Обновление с сайта 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)
Иззи
6

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

bwDraco
источник
3

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

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

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

гимель
источник
1

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

user3362761
источник