Eine andere Möglichkeit, Software für Windows unter Linux zu kompilieren, ist die MinGW-w64-Toolchain auf Archlinux. Es ist einfach zu verwenden und zu warten und bietet aktuelle Versionen des Compilers und viele Bibliotheken. Ich persönlich finde es einfacher als MXE und scheint neuere Versionen von Bibliotheken schneller zu übernehmen.
Zunächst benötigen Sie eine Arch-basierte Maschine (virtuelle Maschine oder Docker-Container reichen aus). Es muss nicht Arch Linux sein, Derivate tun es auch. Ich habe Manjaro Linux verwendet. Die meisten MinGW-w64-Pakete sind nicht in den offiziellen Arch-Repositories verfügbar, aber es gibt viele in AUR. Der standardmäßige Paketmanager für Arch (Pacman) unterstützt keine Installation direkt von AUR, daher müssen Sie einen AUR-Wrapper wie yay oder yaourt installieren und verwenden. Dann ist die Installation der MinGW-w64-Version der Qt5- und Boost-Bibliotheken so einfach wie:
yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt
Dadurch wird auch die MinGW-w64-Toolchain (mingw-w64-gcc
) und andere Abhängigkeiten. Das Cross-Compilieren eines Qt-Projekts für Windows (x64) ist dann so einfach wie:
x86_64-w64-mingw32-qmake-qt5
make
Um Ihr Programm bereitzustellen, müssen Sie die entsprechenden DLLs von /usr/x86_64-w64-mingw32/bin/
kopieren . Beispielsweise müssen Sie normalerweise /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll
kopieren bis program.exe_dir/platforms/qwindows.dll
.
Um eine 32-Bit-Version zu erhalten, müssen Sie einfach i686-w64-mingw32-qmake-qt5
verwenden stattdessen. Cmake-basierte Projekte funktionieren genauso einfach mit x86_64-w64-mingw32-cmake
.Dieser Ansatz hat für mich sehr gut funktioniert, war am einfachsten einzurichten, zu warten und zu erweitern. Er passt auch gut zu kontinuierlichen Integrationsdiensten. Es sind auch Docker-Images verfügbar.
Nehmen wir zum Beispiel an, ich möchte eine QNapi-Untertitel-Downloader-GUI erstellen. Ich könnte es in zwei Schritten tun:
- Starten Sie den Docker-Container:
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
- Klonen und kompilieren Sie QNapi
git clone --recursive 'https://github.com/QNapi/qnapi.git'
cd qnapi/
x86_64-w64-mingw32-qmake-qt5
make
Das ist es! In vielen Fällen wird es so einfach sein. Das Hinzufügen eigener Bibliotheken zum Paket-Repository (AUR) ist ebenfalls unkompliziert. Sie müssten eine PKBUILD-Datei schreiben, die so intuitiv wie möglich ist, siehe zum Beispiel mingw-w64-rapidjson.
(Dies ist eine Aktualisierung der Antwort von @Tshepang, da sich MXE seit seiner Antwort weiterentwickelt hat)
Gebäude Qt
Anstatt make qt
zu verwenden Um Qt zu erstellen, können Sie MXE_TARGETS
verwenden zur Steuerung Ihrer Zielmaschine und Toolchain (32- oder 64-Bit). MXE begann mit .static
und .shared
als Teil des Zielnamens, um anzuzeigen, welche Art von Bibliothek Sie erstellen möchten.
# 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'
In der ursprünglichen Antwort von @Tshepang hat er keinen MXE_TARGETS
angegeben , und der Standardwert wird verwendet. Als er seine Antwort schrieb, war der Standardwert i686-pc-mingw32
, jetzt ist es i686-w64-mingw32.static
. Wenn Sie explizit MXE_TARGETS
setzen bis i686-w64-mingw32
, wobei .static
weggelassen wird , wird eine Warnung ausgegeben, da diese Syntax nun veraltet ist. Wenn Sie versuchen, das Ziel auf i686-pc-mingw32
zu setzen , wird ein Fehler angezeigt, da MXE die Unterstützung für MinGW.org (d. h. i686-pc-mingw32) entfernt hat.
qmake
wird ausgeführt
Da wir den MXE_TARGETS
geändert haben , die <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake
Befehl funktioniert nicht mehr. Was Sie jetzt tun müssen, ist:
<mxe root>/usr/<TARGET>/qt/bin/qmake
Wenn Sie MXE_TARGETS
nicht angegeben haben , tun Sie dies:
<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake
Aktualisierung: Der neue Standardwert ist jetzt i686-w64-mingw32.static
Verwenden Sie einfach die M-Cross-Umgebung (MXE). Es nimmt den Schmerz aus dem ganzen Prozess heraus:
-
Erhalten Sie es:
$ git clone https://github.com/mxe/mxe.git
-
Build-Abhängigkeiten installieren
-
Erstellen Sie Qt für Windows, seine Abhängigkeiten und die Cross-Build-Tools; dies dauert etwa eine Stunde auf einem schnellen Computer mit anständigem Internetzugang; der Download beträgt etwa 500 MB:
$ cd mxe && make qt
-
Wechseln Sie in das Verzeichnis Ihrer App und fügen Sie die Cross-Build-Tools zum PATH hinzu Umgebungsvariable:
$ export PATH=<mxe root>/usr/bin:$PATH
-
Führen Sie das Qt-Makefile-Generator-Tool aus und erstellen Sie dann:
$ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
-
Sie sollten die Binärdatei im Verzeichnis ./release finden:
$ wine release/foo.exe
Einige Anmerkungen :
-
Verwenden Sie den Hauptzweig des MXE-Repositorys; Es scheint viel mehr Liebe vom Entwicklungsteam zu bekommen.
-
Die Ausgabe ist eine statische 32-Bit-Binärdatei, die auf 64-Bit-Windows gut funktioniert.
Ok, ich glaube, ich habe es herausgefunden.
Teilweise basierend auf https://github.com/mxe/mxe/blob/master/src/qt.mk und https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak
Es scheint, dass "anfangs", wenn Sie configure (mit -xtarget usw.) ausführen, es konfiguriert und dann Ihren "Hosts" gcc ausführt, um die lokale Binärdatei ./bin/qmake
zu erstellen ./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...
dann führst du normales "make" aus und es baut es für mingw
make
make install
also
-
ja
-
nur, wenn Sie etwas anderes als msvcrt.dll (Standardeinstellung) verwenden müssen. Obwohl ich noch nie etwas anderes verwendet habe, weiß ich es nicht genau.
-
https://stackoverflow.com/a/18792925/32453 listet einige Konfigurationsparameter auf.