Подтвердить что ты не робот

Почему GCC-Windows зависит от cygwin?

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

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

Почему это?

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

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

Так что же сделка с 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 для доступа к файловой системе (и для других низкоуровневых материалов)? Если это так, то мне интересно, почему они не просто статически связывают свои любимые окна с POSIX-библиотеками. Зачем требовать от пользователя устанавливать зависимости, когда они могут создавать эти зависимости прямо в приложении?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Версия Cygwin для GCC требует Cygwin для компиляции программ.

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

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

Влияет ли поддержка GCC на Cygwin/MinGW под Windows?

  • POSIX.4: программирование для реального мира, Bill O. Gallmeister, O'Reilly and Associates, Inc., стр. 2

Ответ 4

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

Ответ 5

Почему? Потому что когда GCC был создан, Windows 32 бит даже не выходил...

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

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

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

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

Ответ 6

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

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

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

EDIT: чтение вашего редактирования. Я уже не уверен, что вы спрашиваете, почему gcc сам нуждается в библиотеках mingw/cygwin или если программы, скомпилированные с помощью gcc on Win, требуют этих библиотек.

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

Потому что люди, которые ведут GCC, ненавидят Windows со страстью (однажды прочитайте Столлмана). Поэтому, перенося GCC на Windows, они делают все возможное, чтобы сделать вид, что это просто еще один Unix.

Это, и они, вероятно, не хотят тратить время на удаление зависимостей POSIX от кода.