Both sides previous revisionPrevious revisionNext revision | Previous revision |
msys2_mingw [2024/03/04 13:21] – [Интеграция MSYS2 и VSCode] admin | msys2_mingw [2024/03/19 16:25] (current) – admin |
---|
под 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 программ, |
как в старом добром **Mingw**. Компилятор и там и там - знакомый **Mingw-w64**, но по-разному настроенный. Да, | как в старом добром **Mingw**. Компилятор и там и там - знакомый **Mingw-w64**, но по-разному настроенный. Да, |
не забываем что всё это может существовать в 32-бит, 64-бит и все комбинации между ними! | не забываем что всё это может существовать в 32-бит, 64-бит и все комбинации между ними! |
[[https://www.msys2.org/docs/environments/| Табличка с "окружениями"]] | [[https://www.msys2.org/docs/environments/| Табличка с "окружениями"]] |
| |
Давайте запустим "MSYS2 MinGW 32bit". Вот теперь у нас доступен компилятор **gcc**, причем он полностью | Давайте запустим "MSYS2 MinGW 32bit". Вот теперь у нас доступен нужный компилятор **gcc**, причем он полностью |
настроен, с указанием папки ''include'', линкера и пути к библиотекам. Ура! | настроен, с указанием папки ''include'', линкера и пути к библиотекам. Ура! |
| |
Кроме явного отсутствия "юниксовых" возможностей типа //fork()//, вида слешей в путях к файлам и т.д. расхождения могут быть совсем неожиданные (и в разных версиях Windows - разные). | Кроме явного отсутствия "юниксовых" возможностей типа //fork()//, вида слешей в путях к файлам и т.д. расхождения могут быть совсем неожиданные (и в разных версиях Windows - разные). |
Например, //printf()// не поддерживает формат ''%zd'' для типа ''size_t'', поддержка UTF-8 довольно странная и другие неожиданные вещи. Компилятор | Например, //printf()// не поддерживает формат ''%zd'' для типа ''size_t'', поддержка UTF-8 довольно странная и другие неожиданные вещи. Компилятор |
**Mingw-w64** знает много таких особенностей и по мере возможностей дает предупреждения. [[https://www.msys2.org/wiki/Porting/|Подробности]]. Если же нужны юниксовые фишки и не пугает зависимости от 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**. |
| |
**ПРИМЕЧАНИЕ2:** Компиляторы **gcc**, а особенно **g++** иногда создают код, который зависит от библиотек | **ПРИМЕЧАНИЕ2:** Компиляторы **gcc**, а особенно **g++** иногда создают код, который зависит от библиотек |
Надо сказать, что современных реализаций библиотеки curses есть целых две. Одна из них - ncurses, другая - pdcurses. Давайте установим ncurses для нашей 32-битной сборки: ''pacman -S mingw-w64-i686-ncurses''. | Надо сказать, что современных реализаций библиотеки curses есть целых две. Одна из них - ncurses, другая - pdcurses. Давайте установим ncurses для нашей 32-битной сборки: ''pacman -S mingw-w64-i686-ncurses''. |
| |
**ПРИМЕЧАНИЕ**: Как было написано выше, управление консолью в Windows устроено совсем иначе, чем в UNIX, так что не обходится без глюков. Библиотека ncurses реализована таким образом, что она "чувствует", под какой консолью она работает и включает "магию". Если мы запускаем одну и ту же прогрмамму под UNIX-подобной консолью, она начинает управлять экраном через ESC-последовательности, а если из CMD или PowerShell - через API Windows Console. Но фокус в том, что для ESC-последовательностей нужна база терминалов, а она не всегда доступна. Это дает неприятный результат: программа на ncurses неадекватно работает из "оболочки" **MSYS2 Mingw64 X86**. А из CMD или PowerShell работает нормально. Как это обойти ? Если нужна программа для **MSYS2** - скомпилируйте ее в оболочке **MSYS2 MSYS** с ее библиотеками. | **ПРИМЕЧАНИЕ**: Как было написано выше, управление консолью в Windows устроено совсем иначе, чем в UNIX, так что не обходится без глюков. Библиотека ncurses реализована таким образом, что она "чувствует", под какой консолью она работает и включает "магию". Если мы запускаем одну и ту же прогрмамму под UNIX-подобной консолью, она начинает управлять экраном через ESC-последовательности, а если из CMD или PowerShell - через API Windows Console. Но фокус в том, что для ESC-последовательностей нужна база терминалов, а она не всегда доступна. Это дает неприятный результат: программа на ncurses неадекватно работает из "оболочки" **MSYS2 Mingw64** в которой мы ее только что откомпилировали. А из обычных CMD или PowerShell работает нормально. Как это обойти ? Если нужна программа для среды **MSYS2** - скомпилируйте ее в оболочке **MSYS2 MSYS** с ее библиотеками, а если "чистая виндовая" - в среде **MSYS2 Mingw64**. |
| |
Давайте создадим простую ncurses программу для Windows (конечно же статическую): | Давайте создадим простую ncurses программу для Windows (конечно же статическую): |
$ gcc -static -o curses.exe curses.c -I /usr/include/ncurses -l ncurses -DNCURSES_STATIC | $ gcc -static -o curses.exe curses.c -I /usr/include/ncurses -l ncurses -DNCURSES_STATIC |
| |
Обратите внимание, на ''#include'' - тут подключается заголовочный файл ''curses.h'', в стиле UNIX SYSVr4. Там компилятор обычно ищет ''curses.h'' прямо в ///usr/include// . В нашем случае это не работает, потому что у наc ДВЕ реализации curses и их заголовочные файлы в разных каталогах. Так что нужно добавить ключ -I компилятору для поиска. | Обратите внимание, на ''#include'' - тут подключается заголовочный файл ''curses.h'', в стиле UNIX SYSVr4. Там компилятор обычно ищет ''curses.h'' прямо в ///usr/include// . В нашем случае это не работает, потому что у наc ДВЕ реализации curses и их заголовочные файлы лежат в разных каталогах. Так что нужно добавить ключ -I компилятору для поиска. |
| |
При запуске этой программы в CMD или PowerShell (или кликом из Проводника) все работает как надо - пишет "Hello World !!!" в верхнем левом углу, а при запуске из **MSYS2 Mingw64 X86** программа вылетает: | При запуске этой программы в CMD или PowerShell (или кликом из Проводника) все работает как надо - пишет "Hello World !!!" в верхнем левом углу, а при запуске из **MSYS2 Mingw64 X86** программа вылетает (как и предупреждали): |
| |
[USER@HOST test]$ uname | [USER@HOST test]$ uname |
Другая реализация curses - [[https://pdcurses.org/|pdcurses]] сделана еще более интересно. Она может выводить текстовый TUI интерфейс с поддержкой текстовых окошек не только в текстовую консоль, но даже в окно X11, в окно SDL, использовать графику и т.д. Имеется даже [[https://github.com/Bill-Gray/PDCursesMod|форк pdcurses]], который может отрисовывать текст с управлением терминалом в других оконных системах, от Windows GDI до OpenGL. | Другая реализация curses - [[https://pdcurses.org/|pdcurses]] сделана еще более интересно. Она может выводить текстовый TUI интерфейс с поддержкой текстовых окошек не только в текстовую консоль, но даже в окно X11, в окно SDL, использовать графику и т.д. Имеется даже [[https://github.com/Bill-Gray/PDCursesMod|форк pdcurses]], который может отрисовывать текст с управлением терминалом в других оконных системах, от Windows GDI до OpenGL. |
| |
/не дописано/ | /не дописано т.к. имеются проблемы с pdcurses/ |
| |
Еще одна популярная библиотека, требующих прямого управления консолью - [[https://ru.wikipedia.org/wiki/GNU_Readline|readline]]. Библиотека GNU Readline очень удобна для ввода и используеся довольно широко. Самый известный пример - ''bash''. Давайте установим: ''pacman -S mingw-w64-i686-readline''. | Еще одна популярная библиотека, требующих прямого управления консолью - [[https://ru.wikipedia.org/wiki/GNU_Readline|readline]]. Библиотека GNU Readline очень удобна для ввода и используеся довольно широко. Самый известные примеры - ''bash'' и ''gdb''. Давайте установим: ''pacman -S mingw-w64-i686-readline''. |
| |
В поставке readline идет несколько примеров. Лежат они (для нашей среды) в ///mingw32/share/readline/// . Можно собрать простейший пример rlbasic.c | В поставке readline идет несколько примеров. Лежат они (для нашей среды) в ///mingw32/share/readline/// . Можно собрать простейший пример rlbasic.c |
$ gcc -static -o rlbasic.exe rlbasic.c -l readline -l ncurses -DNCURSES_STATIC | $ gcc -static -o rlbasic.exe rlbasic.c -l readline -l ncurses -DNCURSES_STATIC |
| |
Опять же, при запуске из среды **MSYS2 Mingw64 X86** программа работает странно (трижды выводит всю строку), а при запуске из CMD или PowerShell - нормально (позволяет редактировать строку и ловит команду "exit". История ввода в этом примере не обрабатывается. | Опять же, при запуске полученной программы из среды **MSYS2** программа работает странно (трижды выводит всю строку и редактирование не работает), а при запуске из CMD или PowerShell - нормально (позволяет редактировать строку и ловит команду "exit"). Библиотека GNU readline подерживает множество функций, например историю ввода, которая в этом примере не обрабатывается. |
| |
Полная документация по [[https://web.mit.edu/gnu/doc/html/rlman_toc.html|GNU Readline Library]]. | Полная документация по [[https://web.mit.edu/gnu/doc/html/rlman_toc.html|GNU Readline Library]]. |
Это неудивительно, так как полученная программа требует для своей работы ''SDL2.DLL'', | Это неудивительно, так как полученная программа требует для своей работы ''SDL2.DLL'', |
а она пока доступна только "изнутри" среды **MSYS2**. Можно пойти двумя путями: первый - установить | а она пока доступна только "изнутри" среды **MSYS2**. Можно пойти двумя путями: первый - установить |
''SDL2.DLL'' "в систему", второй: просто положить ''SDL2.DLL'' в каталог с программой. Тогда за | ''SDL2.DLL'' "в систему" (в C:\Windows\System32), второй: просто положить ''SDL2.DLL'' в каталог с программой. Тогда за |
счет известной особенности Windows "use local DLL" программа при запуске найдет нужную | счет известной особенности Windows "use local DLL" программа при запуске найдет нужную |
DLL и подключит. Скачаем нужный runtime (например 32-битный) на сайте | DLL и подключит. Скачаем нужный runtime (например 32-битный) на сайте |
будут только от "стандартных" DLL имеющихся в Windows. | будут только от "стандартных" DLL имеющихся в Windows. |
| |
==== OpenGL через SDL ==== | ==== OpenGL через SD2L ==== |
| |
Наконец, существует возможность - использовать уже знакомую нам SDL для "склейки" операционной | Наконец, существует возможность - использовать уже знакомую нам SDL2 для "склейки" операционной |
системы и OpenGL. Это намного удобнее т.к. в SDL имеются функции ввода, управления | системы и OpenGL вместо GLU или GLUT. Это намного удобнее т.к. в SDL2 имеются функции ввода, управления |
манипуляторами, звуком, сетью и т.д. и самое главное - обе библиотеки кросс-платформенные. | манипуляторами, звуком, сетью и т.д. и самое главное - обе библиотеки кросс-платформенные. |
| |
<to be continued...> | <to be continued...> |
| |
| https://ps-group.github.io/opengl/ |
| |
| https://ps-group.github.io/opengl/lesson_1 |
| |
| ==== QT ==== |
| |
| Еще одна популярная кроссплатформанная библиотека. |
| |
| Среди пакетов MSYS2 имеется IDE QtCreator |
| |
| Параграф не написан. |
| |
| https://wiki.qt.io/MSYS2 |
| |
| |
==== Интеграция MSYS2 и VSCode ==== | ==== Интеграция MSYS2 и VSCode ==== |
Для удобства программирования будет полезным использовать новомодную "оболочку" [[https://code.visualstudio.com/|VSCode]]. | Для удобства программирования будет полезным использовать новомодную "оболочку" [[https://code.visualstudio.com/|VSCode]]. |
| |
VSCode для Windows поставляется как минимум двух разновидностей: "системная" и "юзеровская". Ставьте системную (скачайте "System Installer" на [[https://code.visualstudio.com/download|странице загрузки]]). Она пропишет себя в путь PATH и т.д. Чтобы **MSYS2** брала системые пути из PATH, нужно в соотвествующем .ini файле (напрмиер C:\msys64\mingw32.ini) раскомментировать параметр ''MSYS2_PATH_TYPE=inherit'' | VSCode для Windows поставляется как минимум двух разновидностей: "системная" и "юзеровская". Ставьте системную (скачайте "System Installer" на [[https://code.visualstudio.com/download|странице загрузки]]). Она пропишет себя в путь PATH и т.д. Чтобы **MSYS2** брала системые пути из PATH, нужно в соотвествующем .ini файле (например C:\msys64\mingw32.ini) раскомментировать параметр ''MSYS2_PATH_TYPE=inherit'' |
| |
Для работы надо запускать VSCode **из MSYS2** а точнее, прямо из командной строки той среды, под которую мы собираем (например "MSYS2 MinGW 32bit"). Это даст VSCode возможность правильно найти пути к нужным компиляторам и библиотекам. | Для работы надо запускать VSCode **из MSYS2** а точнее, прямо из командной строки той среды, под которую мы собираем (например "MSYS2 MinGW 32bit"). Это даст VSCode возможность правильно найти пути к нужным компиляторам и библиотекам. |
Запускать VSCode надо прямо из папки (workspace), в которой мы ведем разработку, то есть "''cd myproject ; Code . &''" (обратите внимание на точку ''.'' что означает: взять текущий каталог как workspace. Знак ''&'' применяется для запуска VSCode в фоне и "отсоединения" консоли). При первом запуске будет создан подкаталог ".vscode" в котором будут лежать файлы .json конфигурации проекта. | Запускать VSCode надо прямо из папки (workspace), в которой мы ведем разработку, то есть "''cd myproject ; Code . &''" (обратите внимание на точку ''.'' что означает: взять текущий каталог как workspace. Знак ''&'' применяется для запуска VSCode в фоне и "отсоединения" консоли). При первом запуске будет создан подкаталог ".vscode" в котором будут лежать файлы .json конфигурации проекта. |
| |
Для среды "MSYS2 MinGW 32bit" и т.д. VSCode во встроенном терминале будет использоваться PowerShell в качестве оболочки вместо ''sh'', поскольку мы собираем виндовую, независимую от **MSYS2** программу. (Если мы будем собирать под среду **MSYS2 MSYS** то будет использоваться родной ''sh''). | Для среды **MSYS2 MinGW 32bit** и т.д. VSCode во встроенном терминале будет использоваться PowerShell в качестве оболочки вместо ''sh'', поскольку мы собираем виндовую, независимую от **MSYS2** программу. (Если мы будем собирать под среду **MSYS2 MSYS** то будет использоваться родной ''sh''). |
| |
[[https://code.visualstudio.com/docs/cpp/config-mingw|Get Started with C++ and MinGW-w64 and Visual Studio Code]] | [[https://code.visualstudio.com/docs/cpp/config-mingw|Get Started with C++ and MinGW-w64 and Visual Studio Code]] |