Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
msys2_mingw [2024/02/14 14:52] – [Интеграция MSYS2 и VSCode] adminmsys2_mingw [2024/03/14 12:38] – [Компилятор и его запуск] admin
Line 50: Line 50:
 под 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-бит и все комбинации между ними!
Line 82: Line 82:
 [[https://www.msys2.org/docs/environments/| Табличка с "окружениями"]] [[https://www.msys2.org/docs/environments/| Табличка с "окружениями"]]
  
-Давайте запустим "MSYS2 MinGW 32bit". Вот теперь у нас доступен компилятор **gcc**, причем он полностью+Давайте запустим "MSYS2 MinGW 32bit". Вот теперь у нас доступен нужный компилятор **gcc**, причем он полностью
 настроен, с указанием папки ''include'', линкера и пути к библиотекам. Ура! настроен, с указанием папки ''include'', линкера и пути к библиотекам. Ура!
  
Line 140: Line 140:
 Кроме явного отсутствия "юниксовых" возможностей типа //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++** иногда создают код, который зависит от библиотек
Line 166: Line 166:
 Надо сказать, что современных реализаций библиотеки 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 (конечно же статическую):
Line 186: Line 186:
   $ 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
Line 199: Line 199:
 Другая реализация 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
Line 208: Line 208:
   $ 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]].
Line 289: Line 289:
 Это неудивительно, так как полученная программа требует для своей работы ''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-битный) на сайте
Line 351: Line 351:
 будут только от "стандартных" 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
  
 ==== Интеграция MSYS2 и VSCode ==== ==== Интеграция MSYS2 и VSCode ====
Line 363: Line 367:
 Для удобства программирования будет полезным использовать новомодную "оболочку" [[https://code.visualstudio.com/|VSCode]]. Для удобства программирования будет полезным использовать новомодную "оболочку" [[https://code.visualstudio.com/|VSCode]].
  
-VSCode для Windows поставляется как минимум двух разновидностей: "системная" и "юзеровская". Ставьте системную (скачайте "System Installer" на [[https://code.visualstudio.com/download|странице загрузки]]). Она пропишет себя в путь PATH и т.д.+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]]
Navigation