2013-04-29 3 views
15

Я пытался понять, что такое Cygwin и MinGW, и найти его очень запутанным. Если вы хотите программировать на C++, вам не нужен компилятор C++? Из того, что я прочитал, похоже, что они стремятся предоставить Unix как операционную систему в Windows, но я не вижу значения этого. Я имею в виду, есть ли причина, по которой C++ не может быть скомпилирован в Windows? Я также читал, что они содержат библиотеки, это потому, что основной язык C++ не поддерживает многие функции, поэтому очень часто встречаются такие библиотеки, как math.h?Зачем нужны Cygwin и MinGW?

+0

Вам не нужны они для компиляции C++ в Windows. Они просто предоставляют вам GCC. – Blender

+0

@Blender, так что вы говорите, что они позволяют запускать GCC на Window, и поскольку GCC настолько популярен, это желательно? – Celeritas

+2

GCC является лишь одним из многих компиляторов C/C++. – Blender

ответ

8

Это объяснение неизбежно будет уже записаны в другом месте, но здесь идет так или иначе ...

Cygwin является совместимой среды выполнения POSIX построен на вершине Win32 API. Он предоставляет в значительной степени совместимую библиотеку POSIX C, и вокруг нее есть своего рода «Cygwin Distro» с менеджером пакетов, который позволяет вам установить тонну программ Unix, портированных под Cygwin. К ним относятся оболочка Unix, GCC (для Cygwin), X, куча кросс-компиляторов и т. Д.

MinGW (-w64) - это проекты, предоставляющие бесплатные (как в общедоступном домене) заголовки и библиотеки Win32. Вы можете видеть это как бесплатную замену заголовков и библиотек в SDK Windows (старых). Они могут использоваться совместно с GCC. Оба проекта и другие третьи стороны предоставляют встроенные сборки GCC для Windows, которые вообще не нуждаются в Cygwin. Эти пакеты можно рассматривать как «полные» (в степени полноты замены MinGW (-w64)) для Windows SDK.

Обратите внимание, что Cygwin также предоставляет кросс-компиляторы Cygwin для Win32: они запускаются на платформе Cygwin, но производят собственные исполняемые файлы Win32.

Другой игрок, MSYS, представляет собой легкую вилку Cygwin, которая обеспечивает только минимальное количество инструментов для запуска сценариев сборки autotools в Windows. MSYS необходимо использовать в сочетании с собственными инструментами MinGW (-w64), это не Cygwin, и вы не можете легко расширить MSYS.

Таким образом, «MinGW (-w64)» часто относится ко всей свободной Windows GNU Toolchain (родной или кросс-компилятор, работающий поверх Cygwin), хотя, строго говоря, это только заголовки и библиотеки.

Чтобы использовать компилятор GCC C++, я предлагаю использовать либо мои пакеты (для создания 32-bit и 64-bit исполняемых файлов), либо mingw-builds. Кроме того, вы можете установить Cygwin и использовать файл setup.exe для установки кросс-компилятора MinGW-w64 и использовать его оттуда, но если вам не нужна почти идеальная эмуляция Unix для скриптов сборки, я бы предложил против нее.

EDIT Вы можете или не знать, что существует другая альтернатива - старый Interix, который обойден подсистему Win32 и строит непосредственно поверх ядра NT. Это предусмотрено как Windows Services for Unix или Subsystem for Unix Applications (доступно для Windows 7 и Windows 8 и older versions of Windows). Это решение доступно для клиентов Windows Pro/Ultimate и предоставляет вам самую близкую к родной поддержке Unix, которую вы собираетесь получить. Черт возьми, вы даже можете использовать Visual Studio для отладки программного обеспечения Unix :)

+0

Не могли бы вы объяснить, что это значит быть «совместимым с POSIX временем выполнения»? Я краснул статью в Википедии о POSIX, но мне все еще не ясно. – Celeritas

+0

POSIX определяет интерфейс ОС, состоящий из множества функций C. Они состоят из стандартной библиотеки C99 (C11?) И каждой дополнительной функции, подробно описанной здесь (http://pubs.opengroup.org/onlinepubs/9699919799/). Примерами являются 'fork',' access', все pthreads (хотя MinGW (-w64) имеет библиотеки, которые обертывают эту часть Win32 API: pthreads-win32 и winpthreads) и т. Д. POSIX также определяет оболочку и утилиты, которые обеспечивается Cygwin (и менее совершенным образом, MSYS). Это все, что требует эмуляции, и, следовательно, работает медленнее, чем кодирование с использованием собственного API Win32. – rubenvb

+0

Итак, в основном C++ содержит некоторые функции, такие как 'fork()', которые существуют в операционных системах Unix, но не в операционных системах Windows? Поскольку они технически являются частью языка, они все равно должны поддерживаться независимо от операционной системы, поэтому точка Cygwin/MinGW - это Windows, которая знает, что делать с программой на C++, которая выполняет код 'fork()'? Кажется странным, что и зависимые от ОС функции являются частью основного языка C++, это потому, что C/C++ был первоначально разработан для Unix? Например, не имеет смысла писать 'system (fork())'? – Celeritas

8

ПРИМЕЧАНИЕ: этот ответ не претендует на исчерпывающую полноту, он просто хочет, чтобы представить простое понимание концепции, из идеологических определений. Использование неточного языка является преднамеренным. Итак, гуру OS, пожалуйста, не ожидайте совершенных определений.

Разница заключается в корнях POSIX/UNIX и окон.

POSIX - это программный интерфейс C для операционных систем (в том числе Shell и утилиты).

Unix и более поздние версии Linux реализует такие интерфейсы сами по себе, Windows изначально - нет. Он имеет собственный способ управления объектами операционной системы (Win32). Mac OS также нет.

GCC - это набор компиляторов, распространенный в системах, которые предлагают интерфейс POSIX.

Чтобы использовать его на Windows, у вас есть -при этом две альтернативы точечных:

  • Добавить в окна библиотеки (код и заголовки), которые добавляют интерфейс POSIX для окон (переводя POSIX вызовы в Windows) и порт всех программ GNU (на основе Linux), компилируя их для использования этой библиотеки: это то, что делает Cygwin.

  • Перепишите программы POSIX, чтобы они включали в себя все, что связано с сопоставлением POSIX-Windows, создавая исполняемый исполняемый файл Windows: это то, о чем говорят MinGW и MSYS.

Методы бота имеют преимущества и недостатки. Короче говоря, в Cygwin, если что-то компилируется под POSIX, оно компилируется под Cygwin (по крайней мере теоретически). Но результатом является UNIX-выглядящая программа, работающая под окнами.

В MinGW вы можете писать собственные программы для Windows (вызывая собственный интерфейс Win32 C), но вы не можете скомпилировать все, что использует функциональность POSIX, не присутствующую в окнах. Наиболее очевидным случаем является отсутствие стандартного интерфейса <thread> MinGW и ограниченная поддержка <locale>.

+0

Спасибо, я ищу упрощение. «POSIX - это программный интерфейс C для операционных систем», что подразумевается под * программным интерфейсом *, вы имеете в виду способ взаимодействия программы с ОС? – Celeritas

+2

@Celeritas: точно. POSIX представляет ОС для размещенной программы как набор вызываемых функций C. Обратите внимание, что Windows делает то же самое, но с другим набором функций. –

+0

GCC на самом деле не ожидает интерфейса POSIX: он может компилироваться в/для нескольких различных систем (включая Windows), и не у всех из них есть полные интерфейсы POSIX C. И обратите внимание, что использование winpthreads MinGW-w64, libstdC++ может предоставить функции '', '' и '', хотя у него могут быть некоторые особенности. – rubenvb

Смежные вопросы