Portál AbcLinuxu, 30. dubna 2025 12:42
Vo viere, že to snáď niekomu pomôže sa pokúsim opísať, ako som zostavoval na Linuxe cross-kompilátor pre MS Windows.
Po chvíľke hľadania som našiel stránku projektu MinGW a špeciálne oficiálny návod. Návod je z 15. septembra 2008 a je to na ňom vidieť. Podporovaná verzia kompilátoru GCC je 3.4.5. K dispozícii je shellový skript, ktorý má všetku námahu spojenú so zostavením prevziať na seba. Ak ho však nakŕmime vyššími verziami balíkov, prestáva pracovať tak, ako by mal. Pravá chvíľa na to, aby človek vyrval vnútornosti tohto skriptu a jal sa z nich vytvoriť niečo funkčné.
Teraz prezradím pointu.
Kľúčom k úspechu sú (ako inak) správne poradie kompilácie, správne nastavené CFLAGS
, LDFLAGS
a správne voľby pre configure
skript.
Netvrdím, že nasledujúci postup je jediný správny, ale pre mňa fungoval.
Všeobecne ku kompilácii: ak to make
zvládne, odporúča sa kompilovať v inom ako zdrojovom adresári.
V nasledujúcich výpisoch toto pravidlo v záujme zjednodušenia zápisu poruším.
Všetky binárne súbory sú stripnuté, kto chce používať nestabilné verzie a reportovať chyby, vie, čo má spraviť.
Ešte jedna poznámka: voľby --disable-shared
a LDFLAGS="--static"
sú artefaktom z mojich pokusov zostaviť statické verzie binárok.
U mňa nič nepokazili, aj keď nefungovali tak, ako som chcel.
Možno sa dajú bez následkov odstrániť.
src
.
GCC
binutils
mingwrt
w32api
export TARGET=i686-pc-mingw32 export PREFIX=$HOME/mingw export PATH=$PREFIX/bin:$PATH
binutils
dlltool
a windres
.
Dôležitá je voľba --with-sysroot
, ktorá nie je poriadne dokumentovaná a jej absencia by neskôr pri linkovaní spôsobila problémy.
./configure --prefix=$PREFIX --target=$TARGET \ --with-gcc --with-gnu-as --with-gnu-ld --disable-nls \ --disable-shared --with-sysroot=$PREFIX \ LDFLAGS="--static" make CFLAGS="-O2 -fno-exceptions" LDFLAGS="-s" make install
GCC
.
Pre istotu je treba vytvoriť elementárnu adresárovú štruktúru v adresári $PREFIX
a nakopírovať hlavičkové súbory z balíkov mingwrt
a w32api
.
Navyše GCC
neskôr hľadá z neznámych príčin hlavičkové súbory v $PREFIX/mingw
, takže si to žiada ešte jeden symbolický odkaz.
mkdir -p "$PREFIX/include" test -e "$PREFIX/usr" || (cd $PREFIX && ln -s . usr ) test -e "$PREFIX/usr/local" || (cd "$PREFIX/usr" && ln -s . local ) cp -r mingwrt-*/include $PREFIX cp -r w32api-*/include $PREFIX test -e "$PREFIX/mingw" || (cd $PREFIX && ln -s . mingw )
gcc stage 1
--with-sysroot
(tentokrát dokumentovaná) a voľby --enable-threads=win32 --disable-win32-registry
.
./configure --prefix=$PREFIX --target=$TARGET \ --with-gcc --with-gnu-as --with-gnu-ld --disable-nls \ --disable-shared --enable-threads=win32 --disable-win32-registry \ --enable-languages=c --with-sysroot=$PREFIX make CFLAGS="-O2 -fomit-frame-pointer" LDFLAGS="-s" make install
w32api
kernel32
, user32
a podobne.
Bezproblémový balíček.
./configure --prefix=$PREFIX --host=$TARGET \ --build=`./config.guess` make CFLAGS="-O2 -mms-bitfields -march=i686" LDFLAGS="-s" make install
mingwrt
CFLAGS
to vyriešilo.
./configure --prefix=$PREFIX --host=$TARGET \ --build=`./config.guess` make CFLAGS="-O2 -mms-bitfields -march=i686 -I$PREFIX/include" LDFLAGS="-s" make install
gcc stage 2
.configure --prefix=$PREFIX --target=$TARGET \ --with-gcc --with-gnu-as --with-gnu-ld --disable-nls \ --disable-shared --enable-threads=win32 --disable-win32-registry \ --enable-languages=c,c++ --with-sysroot=$PREFIX make CFLAGS="-O2 -fomit-frame-pointer" LDFLAGS="-s" make install
$PREFIX
.
Ak chceme, zmažeme aj $PREFIX/{doc,man,info}
.
README
, ./configure --help
Tiskni
Sdílej:
ln -s vim emacs
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.