Я не разработчик на С++, но меня всегда интересовали компиляторы, и я заинтересован в том, чтобы поработать с некоторыми материалами 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-библиотеками. Зачем требовать от пользователя устанавливать зависимости, когда они могут создавать эти зависимости прямо в приложении?