Кто использует Mingw ?

Поиск, обмен ссылками, вопросы по устаревшему программному обеспечению.
Ответить
Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 17.12.2019,21:57

Коллеги, какие сейчас Mingw и MSYS актуальные ?
Тот который http://www.mingw.org/ уже даже не ставится...

Аватара пользователя
svinka
Advanced Member
Сообщения: 2856
Зарегистрирован: 25.06.2016,04:12
Откуда: Чертаново

Кто использует Mingw ?

Сообщение svinka » 18.12.2019,01:57

alecv, не использую. Форк от 2007 года успешно развивается

http://mingw-w64.org/doku.php

Давеча вышла новая версия CygWin

http://www.opennet.ru/opennews/art.shtml?num=52046

Ekb
Advanced Member
Сообщения: 2603
Зарегистрирован: 15.06.2014,11:31

Вклад в сообщество

Кто использует Mingw ?

Сообщение Ekb » 18.12.2019,05:50

Mingw и MSYS - что это ?
Последний раз редактировалось Ekb 18.12.2019,12:09, всего редактировалось 3 раза.

Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 18.12.2019,11:42

svinka, Ок, спасибо, посмотрю этот. Есть еще какой-то MSYS2.

Cуgwin64(который новый) содержит кросскомпилятор Mingw (i686-w64-mingw32-gcc)
но у меня что-то криво работают программы с консолью Windows (из CMD) через
ncurses и как следствие libreadline - каша на экране.
Править никто не хочет, старенькая SDL работает - всех устраивает. :)
В чистом Cygwin все работает, но неохота таскать ихние DLL.

Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 19.12.2019,08:01

Ekb, есть же статья на Wiki:
https://ru.wikipedia.org/wiki/MinGW
Если очень кратко - Mingw это порт компилятора GCC, работающий прямо в Windows
и создающий *.EXE (и/или *.DLL) файлы.
На самом деле - это целое семейство утилит для компиляции, как миниум ассемблер, линкер и т.д.

MSYS - это еще целый набор программочек, которые все вместе создают UNIX-подобную среду.
Самая заметная - это пожалуй bash, то есть оболочка CLI.

Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 23.12.2019,12:24

Коллеги, если кому интересно - докладаю после погружение в г... :)

Вобщем сейчас ситуация такая. "Простой" MinGW и "классический" MSYS обновлять перестали
и они зачахли где-то в районе 2015.

Текущая версия MSYS - это MSYS2. Это такой странный гибрид из Cygwin и старого MSYS.
https://www.msys2.org/
Он делает замену путей, так что работают "unix-style" пути к файлам, маскирует расширение *.exe,
поддерживает сигналы и еще много чего. Это, с одной стороны, облегчает перенос и build-инг
всяких кривых программ, с другой стороны, все msys2-программы теперь тянут за собой
DLL-ку: msys-2.0.dll .

Компилятор с тулзами теперь называется Mingw-w64. Это вовсе не значит, что он 64-битный,
это просто такое имя.
http://mingw-w64.org/
Он существует во всех возможных комбинациях: 32-битный (т.е. работающий на 32-бит винде)
для билда 32-битных программ, 64-битный для билдинга 64-битных программ, и все промежуточные
варианты, то есть 32-битный для построения 64-битных и наоборот, 64-битный для 32-бит.

Вы еще не запутались ? Держитесь, это только начало... :)

MSYS2 теперь поддерживает два вида терминалов (т.е. слоя для отрисовки) - один новомодный Mintty,
утащенный с того же Cygwin, который типа лучше поддерживает механизмы терминала Unix, но опять
же, тянет за собой всякое... Другой - почти классическая Windows консоль почти без обвеса (conemu)
но зато с закладками (Tabs). На самом деле, есть еще третий вид терминала (defterm), но он пока
не поддерживается...
https://github.com/msys2/msys2/wiki/Terminals
Чтобы запустить MSYS2 c нужным терминалом, надо стартовый 'msys2_shell.cmd' запустить с нужным
ключиком. По-умолчанию запускается Mintty.

Да, сама MSYS2 тоже бывает 32-битная и 64-битная. К счастью на сайте MSYS2 есть нужный инсталлятор,
(msys2-i686 или msys2-x86_64) огромный файл, у которого в пузе целый архив соответствующих программ.
MSYS2 32-битная ставится в C:\msys32, 64-битная - в C:\msys64. Можете попробовать поменять имя,
но тогда никто ничего не гарантирует... Но вот беда - инсталлятор старый и первое, что нужно сделать -
это обновиться: pacman -Syuu
Этот pacman первым делом обновит сам себя, так что ОБЯЗАТЕЛЬНО надо прибить всё окно! НЕ выходя!!!
И запустить pacman -Syuu еще раз.

Вы еще тут ? Я еще держусь, но с трудом... :)

Ну вот например поставили мы 32-битную MSYS2. Давайте попробуем наконец скомпилить HelloWorld
под Windows консоль. А вот хрен вам! Оказывается, теперь есть НЕ ОДИН компилятор, точнее не одна build-система.
Из них первая - для компиляции программ под САМУ MSYS2 (вы же помните, что она тащит за собой теперь как
минимум DLL msys-2.0.dl и работает с unix-путями), а вторая build-система - для "обычных" Windows программ,
как в старом Mingw. Компилятор и там и там - Mingw-w64, но по-разному настроенный. Да,
не забываем что всё это может существовать в 32-бит, 64-бит и все комбинации между ними, гы-гы.
Так что на самом деле у нас бывает (как минимум!) ТРИ build системы: msys2, mingw32 и mingw64.
Все три ставить не обязательно. Например, если нам надо только собирать "чистые" 32-битные программы
на 32-битной винде то можно поставить 32-битную MSYS2 без её компиляторов и build-систему mingw32.
(на самом деле это будет 32-битный Mingw-w64 работающий под 32-битной MSYS2 и который умеет
делать 32-битные "чистые" программы под Windows. Надеюсь крыша у вас еще не поехала...)
Последний раз редактировалось alecv 24.12.2019,14:00, всего редактировалось 10 раз.

Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 23.12.2019,13:55

(Часть II)

Давайте сначала установим тулзы для сборки: pacman -S base-devel
Это установит всякие полезные для сборки утилиты в нашу MSYS2 любой битности.
Установщик pacman знает про себя, 32-бита он или 64, берёт правильные пакеты и ставит
в правильный каталог. Репозиторий для любой MSYS2 всегда называется просто msys2 :)
Компилятор для MSYS2 сюда не входит, да он нам и не нужен.

А вот теперь аккуратнее! Чтобы установить build-систему, которая делает 32-бит программы
надо установить группу "mingw-w64-i686-toolchain". То есть компилятор называется Mingw-w64
(помним, что это просто название такое). Ставится он на текущую MSYS2 и будет
генерить 32-битные программы (хвостик -i686). Делаем: pacman -S mingw-w64-i686-toolchain
Пакеты скачаются (из репозитория mingw32) и будут установлены.
Вот только никакого компилятора не появится!

Чтобы воспользоваться нужным компилятором, надо запустить нашу MSYS2 особым образом.
Если вы откроете кнопку Пуск --> Все программы --> "MSYS2 32bit" то увидите три разных "среды":
"MSYS2 MinGW 32bit", "MSYS2 MinGW 64bit" и "MSYS2 MSYS". По крайней мере, на Windows7 так,
Где эта папка на Windows10 - не знаю. Вот эти три разные режима запуска и делают всю магию.
Альтернативный путь - запускать C:\msys32\msys2_shell.cmd с ключами -mingw32, -mingw64
или -msys2. Это точно то же самое.

Запустим "MSYS2 MinGW 32bit". Теперь у нас доступен компилятор gcc, причем он полностью
настроен, с указанием папки include, линкера и пути к библиотекам. Ура!

Создадим Си-шный файлик hello.c со стандартным библиотечным вызовом:

Код: Выделить всё

#include <stdio.h>

int main () {
   printf("Hello, Phantom!\n");
   return 0;
}
откомпилим его:

Код: Выделить всё

alecv@ALECV-PC MINGW32 /c/TEMP/TEST
$ gcc -o hello hello.c
и запустим ПРЯМО ИЗ CMD.EXE:

Код: Выделить всё

C:\TEMP\TEST>hello
Hello, Phantom!
Всё работает.
Есть и недостатки - полученный EXE-шник имеет размер почти 300Kb! Воспользуемся командой
strip и удалим из него все лишнее. Получится EXE-шник около 16К, что гораздо лучше.
Посмотрим, что у нас получилось:

Код: Выделить всё

alecv@ALECV-PC MINGW32 /c/TEMP/TEST
$ file hello.exe
hello.exe: PE32 executable (console) Intel 80386, for MS Windows

alecv@ALECV-PC MINGW32 /c/TEMP/TEST
$ ldd hello.exe
        ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x772c0000)
        kernel32.dll => /c/Windows/system32/kernel32.dll (0x768e0000)
        KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x75130000)
        msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x76ae0000)
Это чистое автономное 32-битное консольное приложение, которое использует только
стандартные библиотеки 32-битного Windows (можно поспорить насчет стандартности
MSVCRT.DLL, но по факту, она есть практически везде). Скорее всего программа будет
работать даже в Windows 95 (не пробовал).

В данном пакете сразу включен Windows SDK, поэтому можно писать программы на Win32 API,
как невинные типа Пишем простое консольное приложение на чистом WinAPI так и более
серьезные, типа CreateFile( L"\\\\.\\PhysicalDrive0"...

Давайте теперь напишем оконную программку под Windows (точнее под Win32). Вытащим
пример из старика Петзольда (Charles Petzold. Programming Windows):

Код: Выделить всё

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     MessageBox (NULL, TEXT ("Hello, Windows!"), TEXT ("HelloMsg"), 0) ;
     return 0 ;
}
откомпилируем:

Код: Выделить всё

alecv@ALECV-PC MINGW32 /c/TEMP/TEST
$ gcc -mwindows -o hellowin hellowin.c
Все работает. Чтобы указать, что у нас оконная, а не консольная программа,
используется ключ -mwindows . Первоначально ключ -m служил для указания модели машины или
процессора, а тут его приспособили для указания "подсистемы". Если в программе есть WinMain,
то даже -mwindows указывать не обязательно, компилятор сам понимает, но на всякий случай укажем.
Последний раз редактировалось alecv 24.12.2019,14:34, всего редактировалось 5 раз.

Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 24.12.2019,10:26

(Часть III.)

Если мы хотим быть современными программистами, то лучше писать на каком-нибудь
Framework (как етто по рюски?). Например, очень большое число разных эмуляторов
винтажных систем написано на SDL.
https://www.libsdl.org/
По SDL в сети просто огромное число примеров, туториалов, введений и т.д. SDL рисует,
поёт, поддерживает джойстик и сеть, может быть даже варит кофе... Текущая версия: SDL2.
Давайте поставим себе SDL2 вместе со всеми её запчастями :
pacman -S mingw-w64-i686-SDL2 mingw-w64-i686-SDL2_gfx mingw-w64-i686-SDL2_image \
mingw-w64-i686-SDL2_mixer mingw-w64-i686-SDL2_net mingw-w64-i686-SDL2_ttf
(набирать в одну строку или покомпонентно)

Напишем небольшую программу под SDL:

Код: Выделить всё

#include <SDL2/SDL.h> 
  
int main(int argc, char *argv[]) 
{ 
   SDL_Event e;
   int quit = 0;
   SDL_Window* win;
   SDL_Surface* surf;

   SDL_Init(SDL_INIT_EVERYTHING);
   win = SDL_CreateWindow("Hello SDL!", 
                          SDL_WINDOWPOS_CENTERED, 
                          SDL_WINDOWPOS_CENTERED, 
                          320, 240, 0);
   surf = SDL_GetWindowSurface( win );
   SDL_FillRect( surf, NULL, 
               SDL_MapRGB( surf->format, 0, 0, 0xFF ) );
   SDL_UpdateWindowSurface( win );
   while( !quit )
      {    
      while( SDL_PollEvent( &e ) != 0 )
         {
            if( e.type == SDL_QUIT )
               {
                  quit = 1;
               }
         }
      }
   SDL_DestroyWindow(win);
   SDL_Quit();
   return 0; 
} 
Программа просто создает маленькое (320x240) окошко с заголовком, закрашивает его синим
(R=0, G=0, B=0xFF) и ждет, когда из нее выйдут.

Компиляция чуть сложнее.
  • Первое: SDL ПЕРЕОПРЕДЕЛЯЕТ функцию main(). То есть наша main() вызывается
    ИЗ системы SDL, а стартует программа с SDL_main(). Это надо явно описать.
  • Второе: Поскольку мы не используем WinMain(), но хотим программу под Windows и не хотим,
    чтобы болталось черное окно консоли, то нам нужно ЯВНО добавлять ключ -mwindows .
  • Третье: При сборке нужно указать, что нам необходима библиотека SDL.
Получается целая куча ключей командной строки. Можно выписать на бумажку или создать make-файл.
Однако всё проще. Многие Frameworks имеют специальные конфиг-файлы, в которых указаны всё
необходимые настройки и нужно просто их использовать. SDL2 - не исключение.

Код: Выделить всё

alecv@ALECV-PC MINGW32 /c/TEMP/TEST
$ sdl2-config --cflags --libs
-I/mingw32/include/SDL2 -Dmain=SDL_main
-L/mingw32/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
Давайте просто подключим вывод в свою командную строку (это делается с помощью
обратного апострофа: ` . Читается как "Использовать ВЫВОД команды" )

Код: Выделить всё

alecv@ALECV-PC MINGW32 /c/TEMP/TEST
$ gcc -o hellosdl hellosdl.c `sdl2-config --cflags --libs`
Если мы попытаемся теперь запустить эту программу из CMD.EXE, мы получим ошибку: "Запуск программы
невозможен, так как на компьютере отсутствует SDL2.dll . Попробуйте переустановить программу."
Это неудивительно, так как полученная программа требует для своей работы SDL2.DLL,
а она доступна только "изнутри" среды MSYS2. Можно пойти двумя путями: первый - установить
SDL2.DLL "в систему", второй: просто положить SDL2.DLL в каталог с программой. Тогда за
счет известной особенности Windows "use local DLL" программа при запуске найдет нужную
DLL и подключит. Скачаем нужный runtime (например 32-битный) на сайте
https://www.libsdl.org/download-2.0.php
и просто положим DLL в каталог с программой. Теперь всё запускается и рисует синее окошко.

Не по теме
Пишите в личку, кому интересно, что дополнить и т.д.
Жаль wiki нету, приходится фигачить в статье...

Аватара пользователя
size_t
Advanced Member
Сообщения: 672
Зарегистрирован: 20.02.2019,14:28
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение size_t » 24.12.2019,21:42

Ну а чо, настоящий Unix way) точнее Linux way, олдовые никсы такой сложности еще не набрали.
Вроде как все логично, главное чего как обычно не хватает в свободном бесплатном софте - работы по одной кнопке (типа, скачал, поставил, заработало).

Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 27.12.2019,17:44

Не по теме
Коллеги, я наверное перенесу статью к себе, а то тут у нас тут она не индерсируется, потому что Google считает
что тут динамический движок, который экспирится через минуту
(Поиск: Why Google doesn't index phpbb page ?
Рекомндуют добавить:
<meta name="googlebot" content="index,follow">
<meta name="robots" content="ALL">
<meta name="robots" content="index, follow">

Аватара пользователя
alecv
Advanced Member
Сообщения: 6993
Зарегистрирован: 05.10.2004,11:13
Откуда: Санкт-Петербург
Контактная информация:

Вклад в сообщество

Кто использует Mingw ?

Сообщение alecv » 15.01.2020,23:26


Ответить