С технической точки зрения, что делает MinGW, что делает возможным использование gcc в Windows?

Несколько вопросов:

  1. Правильно ли понимать, что MinGW по сути берет исходный код gcc и компилирует его в исполняемый файл для Windows, то есть gcc.exe?

  2. В вики MinGW сказано: «MinGW, с другой стороны, предоставляет функции, предоставляемые Win32 API». Это меня смущает. Разве установка Windows по умолчанию уже не предоставляет заголовки Win32 API, которые предоставляют Win32 API, что сделало бы MinGW, предоставляя его снова избыточным? Заголовки, которые предоставляет MinGW, отличаются от тех, которые поставляются с установкой Windows?

  3. Когда у меня есть объектный файл, скомпилированный MinGW gcc, могу ли я просто связать его с библиотекой времени выполнения C в Windows? Я бы не подумал, потому что объектный файл, созданный MinGW gcc, может быть несовместим (например, использует те же соглашения о вызовах), что и библиотека времени выполнения C в Windows.


person igbgotiz    schedule 10.07.2014    source источник
comment
Это больше похоже на то, что они предоставляют Linux-подобные оболочки для Win32. Таким образом, заголовки должны быть больше похожи на заголовки Linux, в то время как реализации фактически будут вызывать Win32 API.   -  person Austin Mullins    schedule 10.07.2014
comment
(1) Да. (2) MinGW предоставляет только функции, предоставляемые Win32 API, в отличие от Cygwin, который предоставляет Unix-подобный уровень эмуляции поверх Windows. (3) MinGW поддерживает соглашения о вызовах, используемые встроенной средой выполнения C Windows, поэтому вы можете ссылаться на нее; обратите внимание, однако, что Microsoft не поддерживает стороннее использование встроенной среды выполнения, поэтому нет никаких гарантий, что она будет работать надежно (хотя на практике это в основном так).   -  person Harry Johnston    schedule 10.07.2014
comment
Вопрос: Разве установка Windows по умолчанию не предоставляет заголовки Win32 API. A: Нет. Заголовки Windows и библиотеки устанавливаются отдельно. С Windows SDK. Или с помощью компилятора Windows, такого как MSVS ... или MinGW.   -  person FoggyDay    schedule 10.07.2014
comment
WRT 3, в Windows нет стандартной библиотеки времени выполнения C. Среда выполнения MSVC устанавливается отдельно от операционной системы!   -  person    schedule 10.07.2014
comment
@duskwulf: MinGW использует библиотеку времени выполнения C MSVCRT.DLL, которая распространяется с последними версиями Windows в качестве компонента ОС.   -  person Ben Voigt    schedule 10.07.2014
comment
Да, Бен Фойгт прав, об этом говорится на первой странице mingw.org   -  person David Grayson    schedule 10.07.2014


Ответы (2)


  1. Что вы имеете в виду под "исходным кодом gcc"? Когда вы говорите «исходный код gcc», вы можете иметь в виду «исходный код компилятора GCC». MinGW - это версия GCC для Windows, поэтому он берет любой исходный код C и создает исполняемые файлы, и это GCC, поэтому он имеет функции этого компилятора.

  2. Я думаю, что файлы заголовков, предоставленные Microsoft (например, windows.h и winusb.h), на самом деле несовместимы с GCC. Проект MinGW включает файлы заголовков, которые совместимы с GCC, поэтому вы можете вызывать функции Windows, такие как ReadFile, из вашей программы. В последний раз, когда я проверял, в MinGW было только несколько файлов заголовков Microsoft; отсутствовал winusb.h.

  3. Почему вы хотите установить связь с библиотекой времени выполнения Windows? Я знаю, что взаимодействие между компиляторами возможно, потому что однажды я написал DLL с компилятором Microsoft C и вызвал ее из программы MinGW (Qt).

person David Grayson    schedule 10.07.2014
comment
1. Я имел в виду исходный код GCC, который при компиляции дает gcc.exe. 2. Почему они несовместимы с GCC? Являются ли они несоответствующим кодом C, который может использовать только компилятор VC? Если это так, то это сделало бы нетривиальной задачей переписать заголовки Windows api, чтобы их можно было передавать в gcc. - person igbgotiz; 10.07.2014
comment
3. Поскольку библиотека времени выполнения Windows предоставляет printf, процесс и прочее, которые необходимы для любой нетривиальной программы. Где еще взять printf? - person igbgotiz; 10.07.2014
comment
@igbgotiz: заголовки, поставляемые с Windows SDK, поддерживают различные компиляторы, но я понимаю, что MinGW не входит в их число. Эти заголовки должны иметь возможность объявлять типы определенного размера (что требует знания компилятора), а также должны иметь возможность объявлять соглашения о вызовах для функции (для чего требуются расширения, специфичные для компилятора). Вы можете сами сравнить заголовки MinGW с заголовками MS, если вам интересно узнать точные различия. - person Harry Johnston; 10.07.2014

  1. GCC - многоплатформенный компилятор, поэтому есть версия для Linux, версия для MacOS, версия для Windows этого компилятора. "MinGW GCC" - одна из как минимум двух существующих версий Windows. «Система MinGW» - это не что иное, как собрание версий некоторых инструментов GNU для Windows.

  2. Я только что прочитал запись MinGW Wiki, и «предоставленный Win32 API», кажется, проясняет разницу между «Cygwin» и «MinGW», а не между «MinGW» и компилятором Microsoft C:

    Для многих инструментов GNU доступны две разные версии для Windows: «Cygwin» и «MinGW».

    Cygwin использует специальную среду эмуляции для имитации Unix-подобной файловой системы. Специальная библиотека будет связана с программами, в которых функции, подобные «fopen», будут преобразовывать имена файлов в форме «/home/mydir/myfile.txt» в такие имена, как «c: \ programs \ cygwin \ home \ mydir \ myfile». текст".

    При использовании компилятора "Cygwin" как командная строка "gcc", так и командные строки программ, созданных (точнее: связанных) им, требуют имен файлов, подобных Unix.

    Однако инструменты «MinGW» ведут себя так же, как и другие программы Windows, и используют обычные библиотеки Windows, где функции, подобные «fopen», ожидают «обычных» Windows-подобных имен файлов, таких как «c: \ somedir \ somefile». Программы, созданные компилятором GCC "MinGW", ведут себя как программы, созданные компилятором Microsoft.

    В отличие от Linux Windows НЕ поставляется с какими-либо файлами заголовков, но они поставляются с API Win32, который необходимо загрузить (> 1 ГБ) из Microsoft. MinGW и Cygwin предоставляют некоторые собственные файлы заголовков, которые почти совместимы с файлами Microsoft, поэтому нет необходимости загружать Win32 API.

  3. Большинство инструментов разработки в Windows используют один и тот же формат файла объекта и статической библиотеки. (Компилятор "Watcom" - одно из немногих исключений.) Это означает, что вы можете смешивать объектные и статические файлы библиотеки, скомпилированные разными компиляторами. (Формат библиотек-заглушек .lib / .a, используемых для динамического связывания с библиотеками DLL, отличается в gcc и Microsoft, поэтому их нельзя смешивать!)

По поводу комментария к другому ответу:

  • MinGW обычно ссылается на «msvcrt.dll», который поставляется с Windows. Этот файл содержит стандартные функции C, такие как printf ().
  • Microsoft Visual C ++ иногда ссылается на «msvcrt.dll», иногда на некоторые библиотеки DLL, такие как «msvcr100.dll». "msvcr100.dll" также содержит стандартные функции C, однако некоторые из них имеют расширенную функциональность (например, Unicode ...). "msvcr100.dll" необходимо установить после того, как он не входит в состав Windows.
  • Cygwin ссылается на файлы типа cygwin1.dll, содержащие вариант Cygwin стандартных функций C (которые отличаются обработкой имен файлов). Излишне говорить, что этот файл не входит в состав Windows, но его необходимо установить позже.

В отличие от «libc» в Linux, все эти библиотеки DLL не вызывают напрямую операционную систему, а вызывают «kernel32.dll», который содержит функции нижнего уровня (например, «WriteFile ()»), которые будут вызывать операционную систему.

person Martin Rosenau    schedule 10.07.2014
comment
Обратите внимание, что Microsoft Visual C ++ не использовала msvcrt.dll со времен VS6, который давно не поддерживается. Все текущие версии VS поставляются со своими собственными средами выполнения C и не поддерживают использование msvcrt.dll. (Это не обязательно означает, что вы не можете этого сделать, это просто не поддерживается.) Использование msvcrt.dll в MinGW не поддерживается AFAIK, хотя на практике, похоже, в основном работает. - person Harry Johnston; 11.07.2014