С технической точки зрения, что MinGW делает возможным gcc на Windows?
Несколько вопросов:
Правильно ли понимать, что MinGW по сути берет исходный код gcc и компилирует его в исполняемый файл для windows, т.е. gcc.exe?
MinGW wiki говорит: "MinGW, с другой стороны, предоставляет функции, предоставляемые Win32 API". Это смущает меня. Разве установка Windows по умолчанию уже не предоставляет заголовки Win32 API, которые предоставляют Win32 API, что сделает MinGW предоставлением его снова избыточным? Отличаются ли заголовки, которые предоставляет MinGW, от тех, которые поставляются с установкой Windows?
Когда у меня есть объектный файл, скомпилированный MinGW gcc, могу ли я просто связать его с библиотекой C на Windows? Я думаю, что нет, потому что объектный файл, сгенерированный MinGW gcc, может быть несовместим (например, использует те же соглашения о вызовах), что и библиотека времени выполнения C в Windows.
2 ответа
GCC - это мультиплатформенный компилятор, поэтому существует версия для Linux, версия для MacOS, версия для этого компилятора для Windows. MinGW GCC - это одна из двух существующих версий Windows. "Система MinGW" - это не что иное, как набор версий некоторых инструментов GNU для Windows.
Я только что прочитал статью в 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 НЕ поставляется с заголовочными файлами, но поставляется с Win32 API, который необходимо загрузить (> 1 ГБ) от Microsoft. MinGW и Cygwin предоставляют некоторые собственные файлы заголовков, которые почти совместимы с файлами Microsoft, поэтому нет необходимости загружать Win32 API.
Большинство инструментов разработки в 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()"), которые будут вызывать операционную систему.
Что вы подразумеваете под "источником gcc"? Когда вы говорите "gcc source", вы можете иметь в виду "исходный код компилятора GCC". MinGW - это версия GCC для Windows, поэтому он берет любой исходный код на C и создает исполняемые файлы, и это GCC, поэтому он обладает функциями этого компилятора.
Я думаю, что файлы заголовков, предоставляемые Microsoft (например, windows.h и winusb.h), на самом деле не совместимы с GCC. Проект MinGW включает в себя заголовочные файлы, которые совместимы с GCC, так что вы можете вызывать функции Windows, такие как
ReadFile
из вашей программы. В прошлый раз, когда я проверял, у MinGW были только некоторые файлы заголовков Microsoft; отсутствовал winusb.h.Почему вы хотите связать с библиотекой времени выполнения Windows? Я знаю, что кросс-компиляторное взаимодействие возможно, потому что я однажды написал DLL с помощью компилятора Microsoft C и вызвал ее из программы MinGW (Qt).