Dalším způsobem křížové kompilace softwaru pro Windows na Linuxu je MinGW-w64 toolchain na Archlinuxu. Snadno se používá a udržuje a poskytuje nejnovější verze kompilátoru a mnoho knihoven. Osobně mi to připadá jednodušší než MXE a zdá se, že novější verze knihoven přijímá rychleji.
Nejprve budete potřebovat stroj na bázi oblouku (postačí virtuální stroj nebo docker kontejner). Nemusí to být Arch Linux, poslouží i deriváty. Použil jsem Manjaro Linux. Většina balíčků MinGW-w64 není k dispozici v oficiálních repozitářích Arch, ale je jich spousta v AUR. Výchozí správce balíčků pro Arch (Pacman) nepodporuje instalaci přímo z AUR, takže budete muset nainstalovat a používat obal AUR jako yay nebo yaourt. Pak je instalace MinGW-w64 verze Qt5 a knihoven Boost tak snadná jako:
yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt
Tím se také nainstaluje MinGW-w64 toolchain (mingw-w64-gcc
) a další závislosti. Křížová kompilace Qt projektu pro Windows (x64) je pak stejně jednoduchá jako:
x86_64-w64-mingw32-qmake-qt5
make
Pro nasazení programu budete muset zkopírovat odpovídající dll z /usr/x86_64-w64-mingw32/bin/
. Obvykle budete například muset zkopírovat /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll
do program.exe_dir/platforms/qwindows.dll
.
Chcete-li získat 32bitovou verzi, stačí použít i686-w64-mingw32-qmake-qt5
namísto. Projekty založené na Cmake fungují stejně snadno s x86_64-w64-mingw32-cmake
.Tento přístup se mi velmi osvědčil, bylo nejsnazší nastavit, udržovat a rozšiřovat. Hodí se také se službami průběžné integrace. K dispozici jsou také obrázky dockeru.
Řekněme například, že chci vytvořit grafické uživatelské rozhraní pro stahování titulků QNapi. Mohl bych to udělat ve dvou krocích:
- Spusťte ukotvitelný kontejner:
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
- Klonujte a zkompilujte QNapi
git clone --recursive 'https://github.com/QNapi/qnapi.git'
cd qnapi/
x86_64-w64-mingw32-qmake-qt5
make
A je to! V mnoha případech to bude tak snadné. Přidání vlastních knihoven do úložiště balíčků (AUR) je také jednoduché. Budete muset napsat soubor PKBUILD, který je tak intuitivní, jak jen může být, viz například mingw-w64-rapidjson.
(Toto je aktualizace odpovědi @Tshepang, protože MXE se od jeho odpovědi vyvinulo)
Budování Qt
Spíše než pomocí make qt
pro sestavení Qt můžete použít MXE_TARGETS
k ovládání vašeho cílového stroje a toolchainu (32- nebo 64bitového). MXE začalo používat .static
a .shared
jako součást názvu cíle, který ukazuje, jaký typ knihovny chcete vytvořit.
# The following is the same as `make qt`, see explanation on default settings after the code block.
make qt MXE_TARGETS=i686-w64-mingw32.static # MinGW-w64, 32-bit, static libs
# Other targets you can use:
make qt MXE_TARGETS=x86_64-w64-mingw32.static # MinGW-w64, 64-bit, static libs
make qt MXE_TARGETS=i686-w64-mingw32.shared # MinGW-w64, 32-bit, shared libs
# You can even specify two targets, and they are built in one run:
# (And that's why it is MXE_TARGET**S**, not MXE_TARGET ;)
# MinGW-w64, both 32- and 64-bit, static libs
make qt MXE_TARGETS='i686-w64-mingw32.static x86_64-w64-mingw32.static'
V původní odpovědi @Tshepang neuvedl MXE_TARGETS
a použije se výchozí. V době, kdy psal svou odpověď, byla výchozí hodnota i686-pc-mingw32
, nyní je to i686-w64-mingw32.static
. Pokud explicitně nastavíte MXE_TARGETS
na i686-w64-mingw32
s vynecháním .static
, vytiskne se varování, protože tato syntaxe je nyní zastaralá. Pokud se pokusíte nastavit cíl na i686-pc-mingw32
, zobrazí se chyba, protože MXE odebrala podporu pro MinGW.org (tj. i686-pc-mingw32).
Spuštění qmake
Jak jsme změnili MXE_TARGETS
, <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake
příkaz již nebude fungovat. Nyní, co musíte udělat, je:
<mxe root>/usr/<TARGET>/qt/bin/qmake
Pokud jste nezadali MXE_TARGETS
, proveďte toto:
<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake
Aktualizace: Nová výchozí hodnota je nyní i686-w64-mingw32.static
Stačí použít M cross environment (MXE). Zbavuje celý proces bolesti:
-
Získejte to:
$ git clone https://github.com/mxe/mxe.git
-
Nainstalujte závislosti sestavení
-
Sestavte Qt pro Windows, jeho závislosti a nástroje pro křížové sestavení; na rychlém počítači se slušným přístupem k internetu to zabere asi hodinu; velikost stahování je asi 500 MB:
$ cd mxe && make qt
-
Přejděte do adresáře své aplikace a přidejte nástroje pro křížové sestavení do PATH proměnná prostředí:
$ export PATH=<mxe root>/usr/bin:$PATH
-
Spusťte nástroj generátoru Qt Makefile a poté sestavte:
$ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
-
Binární soubor byste měli najít v adresáři ./release:
$ wine release/foo.exe
Několik poznámek :
-
Použijte hlavní větev úložiště MXE; zdá se, že se mu dostává mnohem více lásky od vývojového týmu.
-
Výstupem je 32bitový statický binární soubor, který bude dobře fungovat na 64bitovém systému Windows.
Dobře, myslím, že jsem na to přišel.
Částečně založeno na https://github.com/mxe/mxe/blob/master/src/qt.mk a https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak
Zdá se, že „zpočátku“, když spustíte configure (s -xtarget atd.), nakonfiguruje a poté spustí vaše „hosts“ gcc pro vytvoření místního binárního souboru ./bin/qmake
./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...
pak spustíte normální "make" a vytvoří to pro mingw
make
make install
tak
-
ano
-
pouze pokud potřebujete použít něco jiného než msvcrt.dll (jeho výchozí nastavení). I když jsem nikdy nic jiného nepoužil, takže to nevím jistě.
-
https://stackoverflow.com/a/18792925/32453 uvádí některé konfigurační parametry.