====== Crosskompilace s MinGW ====== Dneska se v rychlosti podíváme na to, jak na GNU/Linuxu narychlo vyprodukovat windowsí spustitelnou binárku pomocí MinGW. Tento článek je zaměřen spíše na začátečníky, pokročilí předpokládám pochopí vše z následujícího screenshotu (trochu okurková sezóna no...): {{:howto:programming:mingw_crosscompile.png|}} ===== Instalace MinGW ===== V rychlosti si ověříme, jestli naše distribuce (v mém případě ArchLinux) má balíčky s vývojovým prostředím MinGW. 0 ;) harvie@harvie-ntb ~ $ pacman -Ss mingw community/mingw32-binutils 2.19.1-1 A set of programs to assemble and manipulate binary and object files (mingw) community/mingw32-gcc 4.4.0-1 A C and C++ cross-compilers for building Windows executables on Linux community/mingw32-gcc-base 4.4.0-1 A C cross-compiler for building Windows executables on Linux community/mingw32-runtime 3.15.2-1 mingw32 run-time library community/mingw32-w32api 3.13-1 Windows header files fro mingw32 C cross-compiler Vidím, že balíčky jsou v repozitáři community, neměl by tedy být žádný problém je stáhnout a nainstalovat. Já jsem zvolil instalaci balíčku **mingw32-gcc**, přičemž ostatní balíčky se nainstalovaly jako závislosti. ===== Kompilátor ===== Po instalaci se podíváme, co se nám vlastně nainstalovalo: 0 ;) harvie@harvie-ntb ~ $ ls -l /usr/bin/*mingw* -rwxr-xr-x 1 root root 20776 19. úno 2009 /usr/bin/i486-mingw32-addr2line -rwxr-xr-x 2 root root 44464 19. úno 2009 /usr/bin/i486-mingw32-ar -rwxr-xr-x 2 root root 253608 19. úno 2009 /usr/bin/i486-mingw32-as -rwxr-xr-x 2 root root 209972 25. srp 15.52 /usr/bin/i486-mingw32-c++ -rwxr-xr-x 1 root root 19552 19. úno 2009 /usr/bin/i486-mingw32-c++filt -rwxr-xr-x 1 root root 209044 25. srp 15.52 /usr/bin/i486-mingw32-cpp -rwxr-xr-x 2 root root 68412 19. úno 2009 /usr/bin/i486-mingw32-dlltool -rwxr-xr-x 1 root root 33920 19. úno 2009 /usr/bin/i486-mingw32-dllwrap -rwxr-xr-x 2 root root 209972 25. srp 15.52 /usr/bin/i486-mingw32-g++ -rwxr-xr-x 1 root root 207316 25. srp 15.52 /usr/bin/i486-mingw32-gcc -rwxr-xr-x 1 root root 81176 19. úno 2009 /usr/bin/i486-mingw32-gprof -rwxr-xr-x 2 root root 265696 19. úno 2009 /usr/bin/i486-mingw32-ld -rwxr-xr-x 2 root root 31428 19. úno 2009 /usr/bin/i486-mingw32-nm -rwxr-xr-x 2 root root 176864 19. úno 2009 /usr/bin/i486-mingw32-objcopy -rwxr-xr-x 2 root root 226028 19. úno 2009 /usr/bin/i486-mingw32-objdump -rwxr-xr-x 2 root root 44468 19. úno 2009 /usr/bin/i486-mingw32-ranlib -rwxr-xr-x 1 root root 270432 19. úno 2009 /usr/bin/i486-mingw32-readelf -rwxr-xr-x 1 root root 22856 19. úno 2009 /usr/bin/i486-mingw32-size -rwxr-xr-x 1 root root 22840 19. úno 2009 /usr/bin/i486-mingw32-strings -rwxr-xr-x 2 root root 176868 19. úno 2009 /usr/bin/i486-mingw32-strip -rwxr-xr-x 1 root root 47592 19. úno 2009 /usr/bin/i486-mingw32-windmc -rwxr-xr-x 1 root root 129940 19. úno 2009 /usr/bin/i486-mingw32-windres Jak vidíte, na disku je hromada zajímavých utilit, které názvy odpovídají utilitám pro sestavování linuxových binárek. Z těchto názvů také můžeme odhadnout, že jde hlavně o assembler a kompilátory jazyků C a C++ (všechny optimalizované pro architekturu i486). Použití je naprosto analogické ke kompilaci céčkových programů ve Windows a na Linuxu. ===== Hello, world! ===== Vytvoříme si soubor hello.c s následujícím obsahem: #include #include void main(void) { char text[] = "This is MinGW hello world!"; puts(text); MessageBox(0, text, "some caption", MB_OK | MB_ICONINFORMATION); //For info about MessageBox: http://msdn.microsoft.com/en-us/library/ms645505(VS.85).as } Tento program by po spuštění měl vypsat do konzole text a stejný text zobrazit jako popup. ===== Kompilace ===== Ve chvíli, kdy máme uložený soubor hello.c, můžeme provést samotnou kompilaci: i486-mingw32-gcc hello.c -o hello.exe tím vznikne soubor hello.exe, který už můžeme spustit pomocí WINE... Pozn.: Protože MinGW gcc defaultně kompiluje windowsí binárky se subsystémem, který zobrazí příkazový řádek a to platí i pro grafické aplikace, u kterých nechceme, aby naše aplikace otevírala nějaké okno terminálu navíc, musíme někdy gcc přidat parametr **-mwindows**, který zajistí že okno bude schované. Takto lze mimo jiné také přeměnit běžný program pro příkazový řádek napsaný v C v daemona, který po spuštění poběží na pozadí a vidět bude jen ve výpisu procesů. Mimochodem toto je IMHO jeden z četných nedostatků MS Windows. Na Windows musím překompilovat (nebo alespoň přelinkovat) celý program, abych povolil nebo zakázal zobrazení konzole, což vadí hlavně u grafických programů, kde se používá na ladění a třeba u interpreterů různých jazyků, kde se předem neví, jestli program bude textový nebp grafický. A tak výrobci softwaru musí většinou distribuovat dvě verze jinak naprosto stejného programu. O proti tomu GNU/Linux a podobné se s problémem vypořádaly o dost lépe. Tam totiž platí, že standartní textový (samozřejmě i chybový) výstup má naprosto každý program a záleží jen na rodičovském procesu, který tento program spouští, jak s ním naloží. Například pokud tedy spouštím Chromium (nebo jiný grafický webový prohlížeč) z příkazového řádku, jeho výstup se zobrazí, protože shell jeho výstup čte a zobrazuje, pokud ho ale spouštím pomocí ikonky z grafického prostředí, tak je tento výstup ignorován a vidím jen samotné okno prohlížeče. Samozřejmě je zde i možnost nastavit spouštěcí ikonku tak, aby spustila místo programu terminál, který teprve tento program spustí a výstup zobrazí. Což se opět využívá především u textových aplikací, nebo pro ladění programů. ===== Spuštění ve WINE ===== 0 ;) harvie@harvie-ntb Temp $ WINEDEBUG=fixme-all wine hello.exe This is MinGW hello world! Všimněte si snad jen toho, že jsem na začátek řádku, kde spouštím WINE přidal výraz ''WINEDEBUG=fixme-all'', který potlačí ladící výpisy z WINE. Ale i tak je je WINE trošku línější a zavedení programu nějakou tu chvilku trvá. Naštěstí výslednou binárku lze použít nejen ve WINE, ale samozřejmě také přímo na Microsoft Windows. a to je prozatím vše přátelé ;-)