Почему GCC-Windows зависит от Cygwin? - PullRequest
37 голосов
/ 09 октября 2008

Я не разработчик C ++, но меня всегда интересовали компиляторы, и я заинтересован в том, чтобы поработать с некоторыми элементами GCC (в частности, с LLVM).

В Windows для правильной работы GCC требуется слой эмуляции POSIX (cygwin или MinGW).

Почему это?

Я использую множество других программ, написанных на C ++ и кросс-компилированных для разных платформ (Subversion, Firefox, Apache, MySQL), и ни одна из них не требует Cygwin или MinGW.

Насколько я понимаю, наилучшее программирование на C ++ заключается в том, что вы можете написать достаточно независимый от платформы код и справиться со всеми различиями в процессе компиляции.

Так в чем же дело с GCC? Почему он не может работать в Windows?


EDIT:

Хорошо, два ответа пока говорят, в основном, "GCC использует слой posix, потому что он использует заголовки posix".

Но это на самом деле не отвечает на вопрос.

Допустим, у меня уже есть набор заголовков для моей любимой стандартной библиотеки. Зачем мне все еще нужны заголовки posix?

Требует ли GCC cygwin / mingw для фактического RUN ?

Или ему нужен только слой эмуляции для заголовков и библиотек? Если так, то почему я не могу просто дать ему каталог "lib" с необходимыми ресурсами?


ИЗМЕНИТЬ СНОВА:

Хорошо, я попробую еще раз уточнить вопрос ...

Я также пишу код на языке программирования D . Официальный компилятор называется «dmd», и существуют официальные двоичные файлы компилятора для Windows и Linux.

Версия Windows не требует никакой эмуляции POSIX. И версия для Linux не требует какой-либо эмуляции Win32. Если у компилятора есть предположения относительно его среды, он довольно хорошо скрывает эти предположения.

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

GCC, напротив, настаивает на том, чтобы притворяться, что он работает в среде posix, и просит ME утешить эти предположения, настроив слой эмуляции.

Но что именно в GCC зависит от этого уровня? Он просто ищет заголовки stdlib и предполагает, что он найдет эти заголовки в / usr / lib? *

Если это так, разве я не могу просто попросить его заглянуть в "C: / gcc / lib", чтобы найти эти заголовочные файлы?

Или GCC сам использует библиотеки POSIX для доступа к файловой системе (и для других низкоуровневых операций)? Если это так, то мне интересно, почему они не просто статически связывают свои любимые библиотеки Windows POSIX. Зачем требовать от пользователя установки зависимостей, если они могут встроить эти зависимости прямо в приложение?

Ответы [ 11 ]

37 голосов
/ 26 октября 2008

На самом деле предпосылка вопроса неверна: MinGW GCC НЕ требуется Cygwin.

Вы увидите, что Cygwin вам вообще не нужен. Он изначально работает в Windows (32-битный, по крайней мере). И набор инструментов, и созданные двоичные файлы не зависят от Cygwin.

Компиляторы MinGW, доступные в Cygwin, отличаются: они построены на платформе Cygwin для генерации кода, который не зависит от времени выполнения Cygwin. В этом случае сами компиляторы зависят от Cygwin. Но это потому, что вы установили их из Cygwin.

29 голосов
/ 10 декабря 2008

Для версии Cygwin GCC требуется Cygwin для программ, которые она компилирует.

Версия MinGW не требует ничего после компиляции, кроме рабочей копии Windows.

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

Если вам нужна оболочка в стиле bash, но вы не хотите использовать Cygwin, я бы порекомендовал MSYS .

Cygwin в отличие от MinGW

скопировано с MinGW Wiki

Приложения Cygwin по принципу не считаются «родным приложением Win32», поскольку оно опирается на библиотеку DLL эмуляции POSIX Cygwin® или cygwin1.dll для функций Posix и не использует функции win32 напрямую. MinGW, с другой стороны, предоставляет функции, предоставляемые Win32 API. При переносе приложений под MinGW функции, не являющиеся родными для Win32, такие как fork(), mmap() или ioctl(), необходимо будет переопределить в эквивалентах Win32, чтобы приложение работало должным образом.
7 голосов
/ 19 апреля 2009

POSIX (интерфейс переносимой операционной системы) "- это развивающийся, растущий документ, который создается IEEE и стандартизирован ANSI и ISO. Цель POSIX - переносимость приложения с исходным кодом" [1].

В практическом плане цель определяется как возможность написать одну исходную реализацию и запустить ее на разных (POSIX-совместимых) системах только с перекомпиляцией.

GCC - это компилятор, способный выполнить это обещание, и поэтому ему необходим слой кода, который приводит машину к "стандартам" POSIX.

В этом суть ответа на ваш вопрос.

Чтобы понять, что я имею в виду, я предложу вам следующее упражнение:

  • Напишите программу без специфичных для ОС #ifdefs, которая принимает в качестве ввода от пользователя некоторый путь к каталогу и записывает в стандартный вывод список его содержимого (один уровень).

Я думаю, вы обнаружите, что очень трудно писать код, использующий только собственный API-интерфейс WIN32, который компилируется в любой системе UNIX или LINUX

Писать код, использующий POSIX API, будет намного проще - как вы можете на любом устройстве LINUX - и компилировать его под Windows (DevStudio2005 имеет удивительное количество POSIX-совместимых заголовков ... в состоянии подобраться).

Возьмите программу LINUX сверху и скомпилируйте ее в GCC, работающем под Cygwin или MinGW. Держу пари, он компилируется и запускается.

Как GCC проявил эту магию? Заголовки POSIX и реализации, лежащие в их основе, предоставлены Cygwin или MinGW.

Имеет ли смысл GCC в использовании Cygwin / MinGW под Windows сейчас больше смысла?

  1. POSIX.4: Программирование для реального мира, Билл О. Галлмейстер, O'Reilly & Associates, Inc., стр. 2
5 голосов
/ 04 ноября 2008

Я стараюсь, чтобы мои программы под Windows вели себя как хороший гражданин Windows, а под Linux - как хороший гражданин Linux.

4 голосов
/ 19 апреля 2009

Почему? Потому что при создании GCC 32-битная версия Windows даже не выходила ...

Чтобы быть более точным - он был разработан для ОС UNIX / Posix. Позже он был портирован на Windows.

Windows не является POSIX-совместимой системой. Это даже не обеспечивает очень простой функциональности. Попробуйте найти readdir или stat под компилятором Windows? И это настолько простой базовый функционал, что вам нужно написать компилятор!

Для ясности, скомпилированным программам GCC обычно требуется только один mingw32.dll для добавления отсутствующей функциональности для возможности запуска.

Итак ... Вы спрашиваете, почему GCC требуется некоторый слой POSIX? Поскольку ОС Windows не является операционной системой POSIX.

3 голосов
/ 05 мая 2009

Я не разработчик C ++, но я всегда интересовались компиляторами, и я заинтересован в том, чтобы возиться с некоторые вещи GCC (особенно LLVM)

Обратите внимание, что LLVM и GCC не связаны между собой. LLVM во многом является результатом исследования, проведенного Крисом Латтнером (http://llvm.org/developers.cgi)) о современной оптимизации. Его работы доступны на http://llvm.org.. В настоящее время он в значительной степени спонсируется Apple. C / C ++ / Obj- GCC C-интерфейс используется для llvm-gcc, который испускает машинный код LLVM (и после тонны оптимизаций в llvm, получается финальный исполняемый файл); llvm-gcc - это своего рода хак для соединения нескольких готовых C / C ++ / Obj-C Интерфейс LLVM.

В любом случае, обратите внимание, что команда LLVM также создает собственный полный C / C ++ / Obj-C компилятор, называемый clang. Его реализация на C близка к завершению, поддержка C ++ становится все лучше и лучше, хотя и не знаю об Obj-C.

Так что, если кто-то говорит "компилятор llvm", он на самом деле означает либо llvm-gcc, либо clang. Сама LLVM - это просто низкоуровневая виртуальная машина, содержащая лишь несколько инструкций в форме статического одиночного назначения (примерно 32 инструкции, на расстоянии), но мегатонна оптимизации передается вашему синтаксическому дереву.

3 голосов
/ 09 октября 2008

Windows не предлагает стандартную библиотеку POSIX, поэтому Cygwin предоставляет ее (cygwin1.dll). Пакеты gcc, поставляемые с cygwin, используют его.

mingw, с другой стороны, не обязательно обеспечивает слой POSIX. Например, в используемой мной установке mingw даже нет библиотеки pthread.

Если бы мне это нужно, мне бы пришлось его установить. Mingw-gcc создает собственный код Win32 (и фактически использует MSVCRT.DLL).

РЕДАКТИРОВАТЬ: читая ваши правки, я больше не уверен, спрашиваете ли вы, зачем самому gcc нужны библиотеки mingw / cygwin, или если программы, скомпилированные с gcc на Win, требуют этих библиотек

2 голосов
/ 09 октября 2008

Большая часть программного обеспечения, скомпилированного для разных платформ, скомпилирована ... в MinGW. Единственное отличие от gcc в том, что он сам является компилятором , что означает, что ему нужны все заголовки, которые обычно компилируются с программой, и обычно не требуется запускать результирующую программу. *

0 голосов
/ 06 сентября 2015

У вас есть возможность при сборке gcc указать опции enable-threads, отличные от posix, если вы не хотите поддерживать pthreads или OpenMP. Излишне говорить, что они не так хорошо проверены. Существует некоторая сторонняя закрытая поддержка OpenMP с потоками Windows, но ее использование с gcc нарушает лицензию. Поскольку библиотека Windows pthreads является интерфейсом более высокого уровня для функциональности потоков Windows, возможно, это не удивительно, если она не работает так же хорошо или сталкивается с отказом Microsoft от поддержки соответствия. Только недавно Microsoft начала терпеть gcc на Windows. Было время, когда они фактически говорили, что не будут работать над ошибками, о которых сообщают пользователи gcc, даже если они могут быть воспроизведены исключительно с помощью инструментов Microsoft.

0 голосов
/ 22 июня 2010

MinGW-w64 порт gcc создает собственный код для 32- и 64-битной Windows без каких-либо дополнительных зависимостей. См., Например, http://mstenberg.com/blog/2010/06/13/gcc-for-windows/ для краткого руководства по началу работы.

...