Jak skonfigurować Qt dla cross-kompilacji z Linuksa do Windows target?

Chcę skompilować biblioteki Qt (i ostatecznie moją aplikację) dla systemu Windows x86_64 przy użyciu komputera hosta Linux x86_64. Czuję, że jestem blisko, ale mogę mieć fundamentalne niezrozumienie niektórych części tego procesu.

Zacząłem od zainstalowania wszystkich pakietów mingw na moim komputerze Fedora, a następnie modyfikacji win32-g++ qmake.plik conf pasujący do mojego środowiska. Jednak wydaje mi się, że utknąłem z pozornie oczywistymi opcjami konfiguracji dla Qt: -platform i -xplatform. Dokumentacja Qt mówi, że -platform powinna być architekturą komputera-hosta (gdzie kompilujesz), a -xplatform powinna być platformą docelową, dla której chcesz wdrożyć. W moim przypadku ustawiłem -platform linux-g++-64 i -xplatform linux-win32-g++ gdzie linux-win32-G++ jest moją zmodyfikowaną konfiguracją win32-g++.

Mój problem polega na tym, że po wykonaniu configure z tymi opcjami widzę, że wywołuje kompilator mojego systemu zamiast kompilatora krzyżowego (x86_64-W64-mingw32-gcc). Jeśli pominę opcję -xplatform i ustawię -platform na mój target spec (linux-win32-g++), wywołuje kompilator krzyżowy, ale potem błędy, gdy znajdzie niektóre funkcje związane z Uniksem nie są zdefiniowane.

Oto wyniki mojej ostatniej próby: http://pastebin.com/QCpKSNev .

Pytania:

  1. Czy podczas kompilacji krzyżowej czegoś takiego jak Qt Dla Windows z hosta Linuksa, należy wywoływać natywny kompilator kiedykolwiek? Oznacza to, że podczas procesu kompilacji krzyżowej nie powinniśmy używać tylko krzyża kompilator? Nie rozumiem, dlaczego skrypt konfiguracyjny QT próbuje wywołać natywny kompilator mojego systemu, gdy podam opcję -xplatform.

  2. Jeśli używam kompilatora krzyżowego mingw, kiedy będę musiał poradzić sobie z plikiem specyfikacji? Pliki Spec dla GCC nadal są dla mnie tajemnicą, więc zastanawiam się, czy jakieś tło tutaj mi pomoże.

  3. Ogólnie rzecz biorąc, poza określeniem kompilatora krzyżowego w moim qmake.conf, co jeszcze muszę rozważyć?

Author: Tshepang, 2012-06-07

5 answers

Wystarczy użyć m cross environment (MXE) . Usuwa ból z całego procesu:

  • Pobierz:

    $ git clone https://github.com/mxe/mxe.git
    
  • Install build dependencies

  • Zbuduj Qt Dla Windows, jego zależności i narzędzia cross-build; zajmie to około godziny na szybkiej maszynie z przyzwoitym dostępem do Internetu; pobierz to około 500MB:

    $ cd mxe && make qt
    
  • Przejdź do katalogu aplikacji i dodaj narzędzia cross-build do ścieżka zmienna środowiskowa:

    $ export PATH=<mxe root>/usr/bin:$PATH
    
  • Uruchom narzędzie Qt Makefile generator, a następnie zbuduj:

    $ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
    
  • Powinieneś znaleźć binarny w ./ katalog wydania:

    $ wine release/foo.exe
    

Kilka uwag :

  • Użyj gałęzi master repozytorium MXE; wygląda na to, że zespół programistów ma o wiele więcej miłości.

  • Wyjście to 32-bitowy statyczny binarny, który będzie dobrze działał na 64-bitowym Okna.

 56
Author: Tshepang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-23 17:50:52

MXE jest jedną z najbardziej rozpoznawalnych postaci na świecie.]}

Budowanie Qt

Zamiast używać make qt do budowania Qt, możesz użyć MXE_TARGETS do sterowania docelową maszyną i łańcuchem narzędzi (32 - lub 64-bitowym). MXE zaczęło używać .static i .shared jako części docelowej nazwy, aby pokazać, jakiego typu lib chcesz zbudować.

# 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'

W oryginalnej odpowiedzi @Tshepang nie podał MXE_TARGETS, a wartość domyślna jest używana. W tym czasie napisał swoją odpowiedź, domyślnie było i686-pc-mingw32, Teraz jest i686-w64-mingw32.static. Jeśli jawnie ustawisz MXE_TARGETS na i686-w64-mingw32, pomijając .static, zostanie wyświetlone ostrzeżenie, ponieważ ta składnia jest teraz przestarzała. Jeśli spróbujesz ustawić cel na i686-pc-mingw32, wyświetli się błąd, ponieważ MXE usunęło wsparcie dla MinGW.org i686-pc-mingw32).

Running qmake

Ponieważ zmieniliśmy MXE_TARGETS, polecenie <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake nie będzie już działać. Teraz musisz:

<mxe root>/usr/<TARGET>/qt/bin/qmake

Jeśli nie podałeś MXE_TARGETS, Zrób to:

<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake

Aktualizacja: nową wartością domyślną jest teraz i686-w64-mingw32.static

 14
Author: Timothy Gu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-13 04:03:21

Ok myślę, że już to rozgryzłem.

Oparte częściowo na https://github.com/mxe/mxe/blob/master/src/qt.mk i https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak

Wygląda na to, że "początkowo" po uruchomieniu configure (z-xtarget, itd.), konfiguruje następnie uruchamia GCC "hostów", aby zbudować lokalny plik binarny ./ bin / qmake

 ./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...

Potem uruchamiasz normalne "make" i buduje je dla mingw

  make
  make install

Więc

  1. TAK

  2. Tylko wtedy, gdy musisz użyć czegoś innego niż msvcrt.dll (jego domyślne). Chociaż nigdy nie używałem niczego innego, więc nie wiem na pewno.

  3. Https://stackoverflow.com/a/18792925/32453 wymienia kilka konfiguracji.

 3
Author: rogerdpack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:28

Aby skompilować Qt, należy uruchomić skrypt configure, określający platformę hosta za pomocą -platform (np. -platform linux-g++-64 jeśli budujesz na 64-bitowym Linuksie z kompilatorem g++) i platformę docelową za pomocą -xplatform (np. -xplatform win32-g++ jeśli kompilujesz do systemu windows).

Dodałem również tę flagę: -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- który określa prefiks łańcucha narzędzi, którego używam, który będzie poprzedzony 'gcc 'lub' g++ ' we wszystkich plikach Makefile, które budują binaria dla windows.

W końcu możesz problemy podczas budowania icd , które najwyraźniej jest czymś, co jest używane do dodawania wsparcia ActiveX do Qt. Można tego uniknąć, przekazując flagę -skip qtactiveqt do skryptu configure. Mam ten jeden z tego zgłoszenia błędu: https://bugreports.qt.io/browse/QTBUG-38223

Oto cała Komenda configure, której użyłem:

    cd qt_source_directory
    mkdir my_build
    cd my_build
    ../configure \
      -release \
      -opensource \
      -no-compile-examples \
      -platform linux-g++-64 \
      -xplatform win32-g++ \
      -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
      -skip qtactiveqt \
      -v

Jeśli chodzi o pytania:

1-tak. Natywny kompilator zostanie wywołany w celu zbudowania niektórych narzędzi, które są potrzebne w kompilacji proces. Może rzeczy takie jak qconfig lub qmake, ale nie jestem do końca pewien, które dokładnie narzędzia.

2 - Przepraszam. Nie mam pojęcia jakie są pliki specyfikacji w kontekście kompilatorów=/. Ale z tego co wiem, nie musiałbyś się z tym zmagać.

3-możesz określić prefiks kompilatora krzyżowego w wierszu poleceń configure zamiast robić to w qmake.plik conf, jak wspomniano powyżej. Jest też problem z idc, o którym też wspomniałem.

 2
Author: user986730,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-03 12:34:58

Innym sposobem kompilacji oprogramowania dla systemu Windows na Linuksie jest łańcuch narzędzi MinGW-w64 na Archlinux. Jest łatwy w użyciu i utrzymaniu, zapewnia najnowsze wersje kompilatora i wiele bibliotek. Osobiście uważam, że jest to łatwiejsze niż MXE i wydaje się, że szybciej przyjmuje nowsze wersje bibliotek.

Najpierw będziesz potrzebował maszyny opartej na łuku (wystarczy maszyna wirtualna lub kontener dokujący). Nie musi to być Arch Linux, pochodne też się sprawdzą. Używałem Manjaro Linux. Najbardziej Pakiety mingw-w64 nie są dostępne w oficjalnych repozytoriach Arch, ale jest dużo w AUR. Domyślny menedżer pakietów dla Arch (pacman) nie obsługuje instalacji bezpośrednio z AUR, więc musisz zainstalować i używać owijarki AUR, takiej jak pacaur lub yaourt. Następnie zainstalowanie MinGW-w64 wersji bibliotek Qt5 i Boost jest tak proste, jak:]}

pacaur -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt

To również zainstaluje łańcuch narzędzi mingw-w64 (mingw-w64-gcc) i inne zależności. Cross-kompilacja projektu Qt dla windows (x64) jest wtedy tak proste jak:

x86_64-w64-mingw32-qmake-qt5
make

Aby wdrożyć program musisz skopiować odpowiednie biblioteki DLL z /usr/x86_64-w64-mingw32/bin/.

Aby uzyskać wersję 32-bitową, wystarczy użyć i686-w64-mingw32-qmake-qt5. Projekty oparte na Cmake działają równie łatwo z x86_64-w64-mingw32-cmake. Takie podejście działało dla mnie niezwykle dobrze, było najłatwiejsze w konfiguracji, utrzymaniu i rozbudowie. Dobrze sprawdza się również w przypadku usług ciągłej integracji. Dostępne są również obrazy Dockera .

Na przykład, powiedzmy, że chcę zbudować QNapi GUI downloadera napisów. Mogę to zrobić w dwóch krokach:

1) Uruchom kontener docker:

sudo docker run -it burningdaylight/docker-mingw-qt5 /bin/bash

2) klonowanie i kompilowanie QNapi

git clone --recursive 'https://github.com/QNapi/qnapi.git'
cd qnapi/
x86_64-w64-mingw32-qmake-qt5
make
To jest to! W wielu przypadkach będzie to takie proste. Dodawanie własnych bibliotek do repozytorium pakietów (AUR) jest również proste. Musisz napisać plik PKBUILD , który jest tak intuicyjny, jak to tylko możliwe, patrz MinGW-w64-rapidjson, na przykład.
 0
Author: Mykola Dimura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-31 11:38:09