GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie konfiguriere ich Qt für die Cross-Kompilierung von Linux auf das Windows-Ziel?

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:

  1. Starten Sie den Docker-Container:
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
  1. 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

  1. ja

  2. 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.

  3. https://stackoverflow.com/a/18792925/32453 listet einige Konfigurationsparameter auf.


Linux
  1. So legen Sie eine statische IP-Adresse fest und konfigurieren das Netzwerk unter Linux

  2. Remote-Desktop von Windows auf Linux-Desktop mit XRDP

  3. Wie greife ich von Linux aus auf freigegebene Windows-Ordner zu?

  4. Wie erstelle ich ein Travis CI-Testpaket für Linux, OS X, Windows?

  5. So führen Sie SCP vom Linux-Server zum Windows-Client aus

So installieren Sie das Windows-Subsystem für Linux

So konfigurieren Sie Linux als statischen Router

Wie Sie von Windows aus SSH in Ihren Linux-Server einbinden

Wie man SSH in einen Windows 10-Rechner von Linux ODER Windows ODER überall her einfügt

So installieren und konfigurieren Sie das Windows-Subsystem für Linux

So konfigurieren Sie eine statische IP-Adresse auf einem Linux-System