| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| msys2_mingw [2026/06/26 15:20] – [Компилятор и его запуск] admin | msys2_mingw [2026/06/26 15:54] (current) – [Компилятор и его запуск] admin |
|---|
| Дак вот, оказывается, нынче текущая версия **MSYS** - это **[[https://www.msys2.org/|MSYS2]]**. Это такой странный гибрид | Дак вот, оказывается, нынче текущая версия **MSYS** - это **[[https://www.msys2.org/|MSYS2]]**. Это такой странный гибрид |
| из **Cygwin** и старого **MSYS**. Что там нового ? Подобно **Cygwin** он делает замену путей в стиле UNIX, маскирует расширение *.exe, | из **Cygwin** и старого **MSYS**. Что там нового ? Подобно **Cygwin** он делает замену путей в стиле UNIX, маскирует расширение *.exe, |
| поддерживает псевдотерминалы, UNIX-сигналы и еще много чего. Это, с одной стороны, облегчает процесс сборки | поддерживает псевдотерминалы, UNIX-сигналы, файловую систему ''/proc'' и еще много чего. Это, с одной стороны, облегчает процесс сборки |
| всяких нетривиальных UNIX программ, а с другой стороны, теперь все MSYS2-программы, в отличии от старого **MSYS** тянут за собой | всяких нетривиальных UNIX программ, а с другой стороны, теперь все MSYS2-программы, в отличии от старого **MSYS** тянут за собой |
| DLL-ку: ''msys-2.0.dll'' . | DLL-ку: ''msys-2.0.dll'' . |
| |
| Ну вот например поставили мы **MSYS2** (без разницы, 64-битную или 32-битную) и обновились. Давайте попробуем, наконец, скомпилить HelloWorld | Ну вот например поставили мы **MSYS2** (без разницы, 64-битную или 32-битную) и обновились. Давайте попробуем, наконец, скомпилить HelloWorld |
| под Windows-консоль. А вот хрен вам! Оказывается, теперь есть НЕ ОДИН компилятор, точнее не одна build-система (среда, namespace e.t.c.), а несколько. | под Windows-консоль. А вот хрен вам! Оказывается, теперь есть НЕ ОДИН компилятор, точнее не одна build-система (среда сборки, namespace e.t.c.), а несколько. |
| Из них первая - для компиляции программ под __САМУ__ **MSYS2** (вы же помните, что она тащит за собой теперь как | Из них первая - для компиляции программ под __САМУ__ **MSYS2** (вы же помните, что она тащит за собой теперь как |
| минимум DLL ''msys-2.0.dll'' и работает с UNIX-путями?), а остальные build-системы - для обычных "голых" Windows программ, | минимум DLL ''msys-2.0.dll'' и работает с UNIX-путями?), а остальные build-системы - для обычных "голых" Windows программ, |
| настроен, с указанием папки ''include'', линкера и пути к библиотекам. Ура! | настроен, с указанием папки ''include'', линкера и пути к библиотекам. Ура! |
| |
| Если нам надо понять, какое у нас сейчас окружение, то можно посмотреть переменную ''MSYSTEM'', например там будет ''MSYSTEM=MINGW32'' . А чтобы понять, какой у нас компилятор, можно набрать ''which gcc''. Для 32-битного Mingw это будет ''/mingw32/bin/gcc'' . | Если нам надо понять, какое у нас сейчас окружение, то можно посмотреть переменную ''MSYSTEM'', например там будет ''MSYSTEM=MINGW32'' . А чтобы понять, какой у нас компилятор, можно набрать ''which gcc''. Для **Mingw64** создающего 32-битные программы это будет ''/mingw32/bin/gcc'' . |
| |
| ==== Пишем программы ==== | ==== Пишем программы ==== |
| то даже ''-mwindows'' указывать не обязательно, компилятор сам понимает, но на всякий случай укажем. | то даже ''-mwindows'' указывать не обязательно, компилятор сам понимает, но на всякий случай укажем. |
| |
| **ПРИМЕЧАНИЕ1:** Обратите внимание, что наша программа собирается со штатной библиотекой MSVCRT.DLL. Не стоит ждать многого от нее. В MSVCRT.DLL реализован далеко не полный набор функций ''libc''. | **ПРИМЕЧАНИЕ1:** Обратите внимание, что наша программа собирается со штатной библиотекой MSVCRT.DLL. Не стоит ждать многого от нее. MSVCRT.DLL остановилась на уровне C89/C90 и в ней реализован далеко не полный набор функций ''libc''. |
| Кроме явного отсутствия "юниксовых" возможностей типа //fork()//, вида слешей в путях к файлам и т.д. расхождения могут быть совсем неожиданные (и в разных версиях Windows - разные). | Кроме явного отсутствия "юниксовых" возможностей типа //fork()//, //kill()//, //execvp()//, //waitpid()//, направления слешей в путях к файлам и т.д. расхождения могут быть совсем неожиданные (и в разных версиях Windows - разные). |
| Например, //printf()// не поддерживает формат ''%zd'' для типа ''size_t'', поддержка UTF-8 довольно странная и другие неожиданные вещи. Компилятор | Например, //printf()// не поддерживает формат ''%zd'' для типа ''size_t'', поддержка UTF-8 довольно странная и другие неожиданные вещи. Компилятор |
| **Mingw-w64** знает много таких особенностей и по мере возможностей дает предупреждения. [[https://www.msys2.org/wiki/Porting/|Подробности]]. Несколько больше возможностей предоставляет новомодная [[https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-170|UCRT]]. Если же нужны юниксовые фишки и не пугает зависимости от DLL - всегда можно собрать программу под оболочку **MSYS2**. | **Mingw-w64** знает много таких особенностей и по мере возможностей дает предупреждения. [[https://www.msys2.org/wiki/Porting/|Подробности]]. Несколько больше возможностей предоставляет новомодная [[https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-170|UCRT]]. Если же нужны юниксовые фишки и не пугает зависимости от DLL - всегда можно собрать программу под оболочку **MSYS2**. |
| https://wiki.qt.io/MSYS2 | https://wiki.qt.io/MSYS2 |
| |
| Или почитайте книгу | Или почитайте книжки |
| Секунов Николай Юрьевич. Программирование на C++ в Linux, БХВ-Петербург, 2004 | * Секунов Николай Юрьевич. Программирование на C++ в Linux, БХВ-Петербург, 2004 |
| | * Е.Р.Алексеев, Г.Г.Злобин, Д.А.Костюк, О.В.Чеснокова, А.С.Чмыхало Программирование на языке С++ в среде Qt Creator |
| |
| ==== Интеграция MSYS2 и VSCode ==== | ==== Интеграция MSYS2 и VSCode ==== |