User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

TUTORIAL: Qt Crosscompile (Qt5.10.1)

Wed Feb 07, 2018 10:57 am

Hier mein step-by-step Tutorial für Qt 5.10.1 mit RPi Zero W, basierend auf https://wiki.qt.io/RaspberryPi2EGLFS

Wenn "raspberrypi.local" nicht funktioniert, nutze bitte die IP Adresse der Raspberry Pi

Raspberry Pi vorbereiten

Bitte nutze ein neues raspbian (2018-06-27, lite funktioniert eventuell, nicht getestet) image

Update
Die Datei /etc/apt/sources.list öffnen und in der Zeile für deb-src das Kommentar entfernen

Code: Select all

sudo nano /etc/apt/sources.list

Code: Select all

sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
Ein manuelles Kernelupdate wird benötigt damit fehlende Libraries in /opt/vc/lib angelegt werden

Code: Select all

sudo rpi-update
sudo reboot
Abhängigkeiten installieren

Code: Select all

sudo apt-get build-dep qt5-qmake
sudo apt-get build-dep libqt5gui5
sudo apt-get build-dep libqt5webengine-data
sudo apt-get build-dep libqt5webkit5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver
Target einrichten

Code: Select all

sudo mkdir /usr/local/qt5pi
sudo chown -R pi:pi /usr/local/qt5pi
Wenn fertig, Raspberry Pi nicht herunterfahren

Linux Host vorbereiten (zum Beispiel Ubuntu x64)

Update

Code: Select all

sudo apt-get update
sudo apt-get -y upgrade
Abhängigkeiten installieren

Code: Select all

sudo apt-get install gcc git bison python gperf pkg-config gdb-multiarch
Außerdem muss QtCreator installiert werden (Ich nutze Qt 5.10.1 auf Ubuntu 18.04). Man kann Qt aus den Paketquellen nutzen. Allerdings muss man hier wirklich sehr viel nachinstallieren. Einfacher ist es, den Installer ( http://download.qt.io/official_releases ... 5.10.1.run ) zu nutzen.

ssh public key erstellen

Code: Select all

ssh-keygen -t rsa -C pi@raspberrypi.local -N "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub | ssh -o StrictHostKeyChecking=no pi@raspberrypi.local "mkdir -p .ssh && chmod 700 .ssh && cat >> .ssh/authorized_keys"
Verzeichnis erstellen

Code: Select all

sudo mkdir /opt/qt5pi
sudo chown 1000:1000 /opt/qt5pi
cd /opt/qt5pi
Oder, wenn man mehrere Benutzer auf dem System nutzt, die uid 1000 mit dem Usernamen ersetzen (uid/gid 1000 = default user/group)

Toolchain herunterladen

Code: Select all

git clone https://github.com/raspberrypi/tools
Das toolchain binary Verzeichnis zu PATH hinzufügen. Die Datei .bashrc öffnen

Code: Select all

nano ~/.bashrc
und am Ende der Datei diese Zeile einfügen

Code: Select all

export PATH=$PATH:/opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
Die Änderung wird erst übernommen wenn das Terminal neu gestartet wird. Wenn du das Terminal hier schliesst, bitte wieder in den Ordner /opt/qt5pi springen.
Wenn du einen 32Bit Host nutzt, verwende bitte dieses toolchain: /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

Qt Sources downloaden

Code: Select all

wget http://download.qt.io/official_releases/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz
Untar Qt sources

Code: Select all

tar xf qt-everywhere-src-5.10.1.tar.xz
hf konfiguration erstellen

Code: Select all

cp -R qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf
Raspberry Pi sysroot downloaden

Code: Select all

mkdir sysroot sysroot/usr sysroot/opt
rsync -avz pi@raspberrypi.local:/lib sysroot
rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt
Dies dauert eine Weile. Eventuell sieht man hier Fehlermeldungen, dass Dateien nicht übertragen wurden. Das ist normal und kann ignoriert werden. Auf keinen Fall irgendwelche Rechte im Ordner /usr ändern!

Korrekte symlinks für "fehlende" Bibliotheken erstellen

Code: Select all

mv sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup
ln -s sysroot/opt/vc/lib/libEGL.so sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

Code: Select all

mv sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup
ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

Code: Select all

ln -s sysroot/opt/vc/lib/libEGL.so sysroot/opt/vc/lib/libEGL.so.1

Code: Select all

ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/opt/vc/lib/libGLESv2.so.2
Tipp: wenn man die symlinks schon auf der Raspberry Pi ändert, kann man sich diesen Schritt sparen falls man sysroot erneut von der Pi runterladet (zum Beispiel bei Updates)

Absolute symlinks in relative symlinks konvertieren

Code: Select all

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot
Bei diesem Schritt sollte man auf jeden Fall eine Ausgabe erhalten, welche Symlinks geändert wurden. Die Symlinks zeigen nach dem Download von sysroot fälschlicherweise immer auf die Libraries des Hostsystems. Dies soll dadurch korrigiert werden. Hat man keine Ausgabe erhalten, ist irgendetwas schief gelaufen oder dieser Schritt wurde bereits ausgeführt.

Build Verzeichnis erstellen

Code: Select all

mkdir qt5build
Configure

Code: Select all

cd qt5build
../qt-everywhere-src-5.10.1/configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -sysroot /opt/qt5pi/sysroot -prefix /usr/local/qt5pi -opensource -confirm-license -no-gbm -skip qtscript -nomake tests -nomake examples -make libs -pkg-config -no-use-gold-linker -v 2>&1 | tee ../configure.log
QtScript wird übersprungen, ist "deprecated".

Für jede Generation von Raspberry Pi, muss man die Option -device ändern
Raspberry Pi 1 (+ Zero and Zero W): -device linux-rasp-pi-g++
Raspberry Pi 2: -device linux-rasp-pi2-g++
Raspberry Pi 3: -device linux-rasp-pi3-g++
Raspberry Pi 3 with VC4 driver: -device linux-rasp-pi3-vc4-g++

Make

Code: Select all

make 2>&1 | tee ../make.log
make install 2>&1 | tee ../make_install.log
Upload to Raspberry Pi

Code: Select all

cd /opt/qt5pi
rsync -avz sysroot/usr/local/qt5pi pi@raspberrypi.local:/usr/local
Qt Konfiguration

QtCreator öffnen

Tools->Options...->Devices->Add
Generic Linux Device
Ändere Hostname, authentication type key, Username und füge Private Key ( ~/.ssh/id_rsa ) hinzu

Tools->Options...->Build&Run->Debuggers->Add
Ändere name und Verzeichnis ( /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gdb )
Der Debugger aus dem Toolchain funktioniert mit qtcreator nicht.
Man muss gdb-multiarch auf dem Hostsystem installieren (Danke an GrisuMS für den Hinweis) und dessen Pfad (meist /usr/bin/gdb-multiarch ) verwenden.


Tools->Options...->Compilers->Add->GCC->C
Ändere name und Verzeichnis ( /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc )
ABI von <Benutzerdefiniert> auf arm-linux-generic-elf-32bit ändern

Tools->Options...->Compilers->Add->GCC->C++
Ändere name und Verzeichnis ( /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++ )
ABI von <Benutzerdefiniert> auf arm-linux-generic-elf-32bit ändern

Tools->Options...->Qt Versions->Add
Wähle /opt/qt5pi/sysroot/usr/local/qt5pi/bin/qmake

Tools->Options...->Kits->Add
Ändere Name
Geräte Typ: Generic Linux Device
Gerät: Wähle zuvor erstelltes Raspberry Pi Gerät
Sysroot: Wähle /opt/qt5pi/sysroot
C and C++: Wähle zuvor erstellten Raspberry Pi Kompiler
Debugger: Wähle zuvor erstellten Raspberry Pi Debugger
Qt version: Wähle zuvor erstellte Raspberry Pi Qt Version

Fertig :)

Nachdem man ein Projekt angelegt hat muss man noch folgendes an das Ende der .pro Datei schreiben:

Code: Select all

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /home/pi/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
Wenn man den kompilieren-Button in QtCreator drück, wird nur kompiliert.
Drückt man den grünen Play-Button, wird kompiliert, die Binary per sftp auf die Raspberry Pi hochgeladen und ausgeführt
Der Debug-Button sollte ebenfalls funktionieren.

*edit
Bitte hängt bei Problemen die Logdateien an, welche euch zur Verfügung stehen. Nutzt zum hochladen der Dateien zum Beispiel pastebin.com

*edit
Einige kleine Updates gemacht. Qt 5.11.1 muss noch warten, da gibts noch viele Bugs.
Außerdem hab ich ein Bash Script angehängt womit man die Schritte ab "Toolchain herunterladen" automatisch ausführen kann. Ich werd dazu nicht viel erklären... wer wissen will wie es funktioniert muss sich mit Bash Scripting auseinandersetzen ;)

*edit
Leichte Korrekturen. Wer übrigens eine Standaloneanwendung programmieren will und auf 5.11.1 besteht, kann buildroot 2018.08.2 verwenden. Ich will dazu noch nichts sagen... teste selbst noch, aber ich werde hier eine Ergänzung einfügen sobald ich sicher bin, dass der build gut funktioniert.
Außerdem gibt es noch ein paar Stolpersteine. Ist also nix für Anfänger
Attachments
qt5build.0.0.1.zip
(1.27 KiB) Downloaded 616 times
Last edited by mline on Sun Nov 25, 2018 4:57 pm, edited 22 times in total.
<~~>

fbe
Posts: 704
Joined: Thu Aug 17, 2017 9:08 pm

Re: TUTORIAL: Qt Crosscompile

Wed Feb 07, 2018 12:42 pm

mline wrote:
Wed Feb 07, 2018 10:57 am
Wenn "raspberrypi.local" nicht funktioniert, nutze bitte die IP Adresse der Raspberry Pi
Alternativ kann man auch den Pi runterfahren und den Datenträger in den PC stecken und mounten statt übers Netzwerk darauf zuzugreifen. Dann ist das Netzwerk auch garantiert nicht der Flaschenhals bei der Übertragung.

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am

Re: TUTORIAL: Qt Crosscompile

Fri Feb 09, 2018 10:48 pm

Danke für das Tutorial. Das von Qt war schon recht alt und hatte bei mir nicht funktioniert. Ich werde es die Tage mal mit deinem versuchen.
http://technikegge.blogspot.de

ppreininger
Posts: 3
Joined: Wed Feb 28, 2018 10:12 pm

Re: TUTORIAL: Qt Crosscompile

Wed Feb 28, 2018 10:15 pm

Hallo, Tutorial funktioniert prächtig. Ich habe die Version 5.10.1 verwendet.

Was bei mir allerdings nicht gut funktioniert ist das Deploy. Ich habe das Kit so konfiguriert wie angegeben. Das Projekt versucht dann beim Deploy ins /opt/ Verzeichnis am Raspberry das Target anzulegen, was mangels Rechten fehlschlägt. Any Ideas?

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile

Thu Mar 01, 2018 3:55 am

Freut mich :)

Zu deiner Frage:
In der .pro Datei findest du folgende Zeilen (falls nicht kopier das einfach ans Ende der Datei)

Code: Select all

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
Da ersetzt du /opt/ einfach mit /home/pi/
Dann wird im userordner für pi ein Verzeichnis mit dem Projektnamen erstellt, darunter ein Ordner bin und darin befindet sich die binary die ausgeführt wird.
Alternativ dazu kannst du im Ordner /opt/ aber auch ein Verzeichnis mit dem Projektnamen erstellen und den Besitzer zu pi ändern

Code: Select all

sudo mkdir /opt/projektblabla
sudo chown pi:pi /opt/projektblabla
*edit
Darf ich noch fragen, für welche Variante der Pi du Qt 5.10.1 erstellt hast?
<~~>

ppreininger
Posts: 3
Joined: Wed Feb 28, 2018 10:12 pm

Re: TUTORIAL: Qt Crosscompile

Thu Mar 01, 2018 6:35 am

Etwas Ähnliches hatte ich bereits versucht (beide Varianten). Ich habe den Output auch manuell rüber kopiert, da hats funktioniert. Ich glaube ein Restart von Qt hat noch gefehlt, erst seitdem funktioniert. Ich habe für Raspberry PI3 kompiliert.

Einziges Problem, das ich noch habe ist, dass der Debugger nicht will. Fehlermeldung: "The selected build of GDB does not support python scripting. It cannot be used in Qt Creator". Ich werde das dann mal googeln.

ppreininger
Posts: 3
Joined: Wed Feb 28, 2018 10:12 pm

Re: TUTORIAL: Qt Crosscompile

Thu Mar 01, 2018 11:21 am

Ich habe noch eine Frage: wenn ich zwei unterschiedliche PIs verwenden will (PI 3 und einen Zero W), reicht es dann die Schritte ab dem Build mit einem neuen Build Verzeichnis auszuführen, oder werden Teile des Sysroots überschrieben?

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile

Thu Mar 01, 2018 1:31 pm

ppreininger wrote:
Thu Mar 01, 2018 11:21 am
...mit einem neuen Build Verzeichnis auszuführen, ...
Das reicht nicht.
Du musst nach dem build ja ein

Code: Select all

make install
ausführen. Dabei wird qmake quasi aktiviert und alle notwendigen Dateien an die richtige Stelle im sysroot kopiert.

Du müsstest vorher den Ordner build und den Ordner /usr/local/qt5pi unter sysroot löschen.

Du kannst aber auch beide builds gleichzeitig fahren wenn du im configure Schritt den Schalter -prefix (gibt das Verzeichnis an wo make install installiert) änderst und configure in einem separatem Verzeichnis ausführst.
<~~>

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile

Mon Apr 30, 2018 1:52 pm

Falls jemand von euch im Creator diese Fehlermeldung beim kompilieren bekommt

Code: Select all

...libicui18n.so.57: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8'
liegt das an veralteten Libraries im Toolchain. Leider...

Man kann das so beheben (ist aber nur ein Workaround):

Code: Select all

cd /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/lib
mv libstdc++.so.6.0.19 libstdc++.so.6.0.19_backup
cp /opt/qt5pi/sysroot/usr/lib/arm-linux-gnueabihf/libstdc++.so.6.0.22 .
rm libstdc++.so libstdc++.so.6
ln -s libstdc++.so.6.0.22 libstdc++.so.6
ln -s libstdc++.so.6.0.22 libstdc++.so
Die Befehle funktionieren natürlich nur wenn ihr euch an die Pfade des Tutorials gehalten habt.
Die Datei libstdc++.so.6.0.22 mit der Revision 22 gilt natürlich für den aktuellen Stand (30.04.2018), also vorher bitte die Version dieser Datei prüfen und gegebenfalls in den Befehlen anpassen.
<~~>

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile

Sat May 05, 2018 8:09 pm

Wenn man im ersten Schritt bei "Raspberry Pi vorbereiten -> Abhängigkeiten installieren" zusätzlich zu den quellen für libqt5gui5 auch noch die für libqt5webengine-data und libqt5webkit5 installiert, kann man im Schritt "Configure" den Schalter -skip qtwebengine weglassen und die webengine nutzen.
Allerdings bin ich nicht ganz sicher was genau funktioniert, weil nach wie vor gstreamer nicht so richtig klappen will.


*edit
Im aktuellen Post berücksichtigt
Last edited by mline on Sun May 06, 2018 10:55 am, edited 1 time in total.
<~~>

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Sun May 06, 2018 10:54 am

Durch das Update auf 5.10.1 ist der originale Post von mir obsolete. Zur Dokumentation aber hier noch die letzte Version des Posts
Hier mein step-by-step Tutorial für Qt 5.7.1 mit RPi Zero W, basierend auf https://wiki.qt.io/RaspberryPi2EGLFS

Wenn "raspberrypi.local" nicht funktioniert, nutze bitte die IP Adresse der Raspberry Pi

Raspberry Pi vorbereiten

Bitte nutze ein neues raspbian (2017-11-29, lite funktioniert eventuell, nicht getestet) image

Update
Die Datei /etc/apt/sources.list öffnen und in der Zeile für deb-src das Kommentar entfernen

Code: Select all

sudo nano /etc/apt/sources.list

Code: Select all

sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot

Code: Select all

sudo rpi-update
sudo reboot
Abhängigkeiten installieren

Code: Select all

sudo apt-get build-dep qt4-x11
sudo apt-get build-dep libqt5gui5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
Wenn fertig, Raspberry Pi nicht herunterfahren

Linux Host vorbereiten (zum Beispiel Ubuntu x64)

Update

Code: Select all

sudo apt-get update
sudo apt-get -y upgrade
Abhängigkeiten installieren

Code: Select all

sudo apt-get install gcc git bison python gperf
Außerdem muss QtCreator installiert werden (Ich nutze Qt 5.7.1 auf Ubuntu 16.04 weil es mit höheren Versionen Probleme mit den integrierten Menüs gibt)

ssh public key erstellen

Code: Select all

ssh-keygen -t rsa -C pi@raspberrypi.local -N "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub | ssh -o StrictHostKeyChecking=no pi@raspberrypi.local "mkdir -p .ssh && chmod 700 .ssh && cat >> .ssh/authorized_keys"
Verzeichnis erstellen

Code: Select all

sudo mkdir /opt/qt5pi
sudo chown 1000:1000 /opt/qt5pi
cd /opt/qt5pi
Oder, wenn man mehrere Benutzer auf dem System nutzt, die uid 1000 mit dem Usernamen ersetzen (uid/gid 1000 = default user/group)

Clone toolchain

Code: Select all

git clone https://github.com/raspberrypi/tools
Das toolchain binary Verzeichnis zu PATH hinzufügen. Die Datei .bashrc öffnen und am Ende der Datei diese Zeile einfügen

Code: Select all

nano ~/.bashrc

Code: Select all

export PATH=$PATH:/opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
Die Änderung wird erst übernommen wenn das Terminal neu gestartet wird.
Wenn du einen 32Bit Host nutzt, verwende bitte dieses toolchain: /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

Qt Sources downloaden

Code: Select all

wget https://download.qt.io/official_releases/qt/5.7/5.7.1/single/qt-everywhere-opensource-src-5.7.1.tar.xz
Müsste auch mit höheren Versionen funktionieren (Qt 5.9.4 für Raspberry Pi 2 sowie Qt 5.10.1 für Pi Zero und Pi 3 wurde bereits bestätigt)

Untar Qt sources

Code: Select all

tar xf qt-everywhere-opensource-src-5.7.1.tar.xz
hf konfiguration erstellen

Code: Select all

cp -R qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf
Raspberry Pi sysroot downloaden

Code: Select all

mkdir sysroot sysroot/usr sysroot/opt
rsync -avz pi@raspberrypi.local:/lib sysroot
rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt
Das dauert eine Weile

Korrekte symlinks für "fehlende" Bibliotheken erstellen

Code: Select all

mv sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup
ln -s sysroot/opt/vc/lib/libEGL.so sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

Code: Select all

mv sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup
ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

Code: Select all

ln -s sysroot/opt/vc/lib/libEGL.so sysroot/opt/vc/lib/libEGL.so.1

Code: Select all

ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/opt/vc/lib/libGLESv2.so.2
Absolute symlinks in relative symlinks konvertieren

Code: Select all

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
sysroot-relativelinks.py sysroot
Build Verzeichnis erstellen

Code: Select all

mkdir qt5build
Configure

Code: Select all

cd qt5build
../qt-everywhere-opensource-src-5.7.1/configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -sysroot /opt/qt5pi/sysroot -prefix /usr/local/qt5pi -opensource -confirm-license -skip qtwebengine -skip qtscript -nomake examples -make libs -v
Leider wird QtWebengine auf der Raspberry Pi 1 (maybe also Pi 2) nicht kompiliert, wird also übersprungen. Auch QtScript wird übersprungen, ist "deprecated".
Ab 5.9.1 muss man, wenn man Pi 3 nutzt wohl noch die Option -no-use-gold-linker anhängen. Da ich keine Pi 3 besitze kann ich dass leider nicht testen. Probiert es am besten aus.

Für jede Generation von Raspberry Pi, muss man die Option -device ändern
Raspberry Pi 1 (+ Zero and Zero W): -device linux-rasp-pi-g++
Raspberry Pi 2: -device linux-rasp-pi2-g++
Raspberry Pi 3: -device linux-rpi3-g++
Raspberry Pi 3 with VC4 driver: -device linux-rpi3-vc4-g++

Make

Code: Select all

make
make install
Upload to Raspberry Pi

Code: Select all

cd /opt/qt5pi
rsync -avz sysroot/usr/local/qt5pi pi@raspberrypi.local:/usr/local
Qt Konfiguration

QtCreator öffnen

Tools->Options...->Devices->Add
Generic Linux Device
Ändere Hostname, authentication type key, Username und füge Private Key ( ~/.ssh/id_rsa ) hinzu

Tools->Build&Run->Debuggers->Add
Ändere name und Verzeichnis ( /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gdb )

Tools->Compilers->Add->GCC->C
Ändere name und Verzeichnis ( /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc )

Tools->Compilers->Add->GCC->C++
Ändere name und Verzeichnis ( /opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++ )

Tools->Qt Versions->Add
Wähle /opt/qt5pi/sysroot/usr/local/qt5pi/bin/qmake

Tools->Kits->Add
Ändere Name
Geräte Typ: Generic Linux Device
Gerät: Wähle zuvor erstelltes Raspberry Pi Gerät
Sysroot: Wähle /opt/qt5pi/sysroot
C and C++: Wähle zuvor erstellten Raspberry Pi Kompiler
Debugger: Wähle zuvor erstellten Raspberry Pi Debugger
Qt version: Wähle zuvor erstellte Raspberry Pi Qt Version

Fertig :)

*edit
Wenn man den kompilieren-Button in QtCreator drück, wird nur kompiliert.
Drückt man den grünen Play-Button, wird kompiliert, die Binary per sftp auf die Raspberry Pi hochgeladen und ausgeführt
Der Debug-Button sollte ebenfalls funktionieren.

*edit2
Typo

*edit3
Hab das ursprünglich im englischen Forum erstellt. Falls ich nicht alles übersetzt habe schreibt mir bitte ;)

*edit4
Mit dem neuen Image 2018-04-18 und Qt über Version 5.9 gab es leider extrem viele Änderungen die die Abhängigkeiten betreffen (zum Beispiel wird gstreamer nun überhaupt nicht mehr erkannt. Weder 0.1 noch 1.0. Auch Fontconfig und einiger anderer Kram den man eigentlich braucht arbeitet nicht mehr).
Also alles von vorne :(
<~~>

awild
Posts: 6
Joined: Fri May 11, 2018 1:03 pm
Location: Munich, Germany

QT Crosscompile

Fri May 11, 2018 1:33 pm

Hello together,

Since many days I am struggling to get QT Crosscompile for Raspi working.

Finally the crosscompile and the deployment to Raspberry using QT Creator are working fine.
However the simple empty MainWindow example shows the window with maximized size on the screen, and the title bar is missing.
The same example shows correct on the host desktop (a small window 400*300 in size)

I thereafter placed a button onto the window, the button itself shows correct in terms of size on the raspi, however with no text. (It seems that QT does not provide fonts anymore)

I am using Raspi 3B with Raspbian Stretch 18.4.2018 and QT 5.9.1

Anyhow my biggest problem is the incorrect size of the mainwindow on the raspi.

Do I have to enable OpenGL in raspi-config?

many thanks for your kind help

Andy

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: QT Crosscompile

Fri May 11, 2018 7:09 pm

awild wrote:
Fri May 11, 2018 1:33 pm
...
For english support, please use this thread: viewtopic.php?f=67&t=204529

My tutorials just use embedded Qt, thats why the default window behavior is fullscreen instead of window-mode. I dont know how to change this, sorry. Maybe just change the window behavior ( setWindowFlags )

In your build, fontconfig isnt configured (changed after 5.7.1). Add -pkg-config to your configure line, then reconfigure and build it.

You dont have to enable OpenGL.
<~~>

awild
Posts: 6
Joined: Fri May 11, 2018 1:03 pm
Location: Munich, Germany

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Sun May 13, 2018 4:25 pm

Hallo mline,

Deine Antwort hat mir sehr geholfen vielen Dank!
Habe jetzt auch zusätzlich herausgefunden, dass Full Srceen bei EGLFS Standard ist:
Siehe hier: http://doc.qt.io/qt-5/embedded-linux.html
EGLFS forces the first top-level window (be it either a QWidget or a QQuickView) to become fullscreen. This window is also chosen to be the root widget window into which all other top-level widgets (for example dialogs, popup menus or combobox dropdowns) are composited. This is necessary because with EGLFS there is always exactly one native window and EGL window surface, and these belong to the widget or window that is created first. This approach works well when there is a main window that exists for the entire lifetime of the application and all other widgets are either non top-levels or are created afterwards, once the main window is shown.

Bei den Fonts habe ich mir erstmal noch so geholfen auf dem Target:
Symlink in /usr/local/Qt5pi/lib/ : fonts->/usr/share/fonts/truetype/dejavu/
Jedoch werden leider die Fonts viel zu groß dargestellt auf dem Raspi....

Um es nun gescheid zu machen -->
Bekomme ich durch deinen Vorschlag "Add -pkg-config to your configure line, then reconfigure and build it." daraufhin vor dem erneuten Build:
Qt Gui:
Fontconfig ............................. yes angezeigt ??
Ich verstehe noch nicht den bezug von -pkg-config zu Fontfonfig.

Nochmals Danke und schönen Sonntag
Andreas

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Sun May 13, 2018 6:04 pm

awild wrote:
Sun May 13, 2018 4:25 pm
Ich verstehe noch nicht den bezug von -pkg-config zu Fontfonfig.
Bis 5.7.1 wurde fontconfig - welches bei der Installation der Abhängigkeiten auf der Raspberry Pi schon installiert wurde - problemlos erkannt. Ab da gab es aber wohl massive Änderungen. Als ich 5.9.1 und 5.10.1 probiert habe wurden sehr viele Sachen nicht mehr erkannt. Unter anderem fontconfig, pulseaudio, gstreamer, tslib, usw. und bin auf Fehlersuche gegangen.
Da ich den Schalter -pkg-config gleich als erstes ausprobiert habe und bis auf eine Kleinigkeit quasi alles funktioniert hat, habe ich dann auch nicht weitergeforscht.

Der Schalter nutzt halt pkg-config um die Bibliotheken in sysroot zu finden. Ohne pkg-config muss wohl die Version und der Pfad exakt passen damit es klappt.

Was noch nicht so richtig klappt: Wayland.
Hier das Ergebnis im configure.log

Code: Select all

Qt Wayland Client ........................ no
Qt Wayland Compositor .................... no
Da scheint es wohl noch einen Bug zu geben, denn weiter oben im Log ist zu sehen:

Code: Select all

> wayland-scanner client-header < /opt/rony/Qt5Pi/qt-everywhere-src-5.10.1/qtwayland/config.tests/wayland_scanner/scanner-test.xml > wayland-scanner-test-client-protocol.h
> /bin/sh: 1: wayland-scanner: not found
> Makefile:171: recipe for target 'wayland-scanner-test-client-protocol.h' failed
> make: *** [wayland-scanner-test-client-protocol.h] Error 127
<~~>

awild
Posts: 6
Joined: Fri May 11, 2018 1:03 pm
Location: Munich, Germany

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Mon May 14, 2018 2:17 pm

Hallo mline,

leider hat mein Config ergänzt mit -pkg-config nicht funktioniert und es kommt dieser Fehler:

ERROR: Feature 'pkg-config' was enabled, but the pre-condition 'tests.pkg-config' failed.

Hier mein vollständiger Config-Aufruf:
./configure -release -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -v -no-use-gold-linker -pkg-config

Habe ich da noch was vergessen?

Vielen Dank für Deine Antwort im Voraus
Andreas

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Mon May 14, 2018 2:47 pm

Lösch mal den kompletten build-Ordner, erstelle ihn neu und führe dann nochmal configure aus.

Außerdem wäre es noch toll, wenn du an den configure-Befehl noch ein

Code: Select all

 2>&1 | tee configure.log
anhängst (siehe auch Befehl hier im ersten Post) und dieses configure.log dann auf pastebin oder so ladest damit ich mir das Log mal ansehen kann.
<~~>

awild
Posts: 6
Joined: Fri May 11, 2018 1:03 pm
Location: Munich, Germany

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Tue May 15, 2018 5:51 am

Ich habe den Ordner immer schon gelöscht vor Config Änderungen um sicher zu gehen.

Ich habe alles nochmal gemacht, das configure.log findest du hier:
http://www.classicwings-bavaria.com/configure.log

Würde mich sehr freuen, wenn Du was finden kannst.

Andreas

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Tue May 15, 2018 10:23 am

Damit fang ich nix an. Benutze doch bitte den Befehl von mir oder die Option -v damit man auch das komplette Log sieht
<~~>

awild
Posts: 6
Joined: Fri May 11, 2018 1:03 pm
Location: Munich, Germany

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Tue May 15, 2018 2:37 pm

Tut mir leid, da ist mir ein Fehler unterlaufen.

Alles nochmal gemacht, Datei ist jetzt vollständig:

http://www.classicwings-bavaria.com/configure.log

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Wed May 16, 2018 6:37 pm

Konnte leider keine Lösung finden. Ich vermute mal, dass du dich an ein anderes Tutorial als das von mir gehalten hast und da bei irgendeinem Schritt etwas fehlt.
Du könntest auch mal versuchen, den Schalter -release wegzulassen
<~~>

awild
Posts: 6
Joined: Fri May 11, 2018 1:03 pm
Location: Munich, Germany

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Wed May 16, 2018 7:01 pm

Danke für die Mühe!
Ich werde es dann erstmal bei dem SymLink fonts auf /usr/share/fonts/truetype/dejavu belassen. Geht ja auch ganz gut.
Ich hoffe das ich später nicht Probleme mit den Fonts kriege.

Noch ein Hinweis wegen Crossdebugging:
Habe rausgefunden dass der Debugger von der Linaro toolchain arm-linux-gnueabihf-gdb unter QT Creator 4.3.1 folgenden Fehler bringt:
"gdb does not support Python scripting"

Habe dann gdb-multiarch auf dem Host installiert, jetzt geht CrossDebugging zum Raspi mit QT Creator einwandfrei.

Essometer
Posts: 2
Joined: Thu May 30, 2013 1:05 pm

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Tue May 22, 2018 11:42 am

Er findet unter meinem raspberry System die libqt5webengine-data nicht. Alle anderen Abhaengigkeiten wurden ohne Probleme aufgeloest. Hat jemand das gleiche Problem?

User avatar
mline
Posts: 1553
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Tue May 22, 2018 3:42 pm

Essometer wrote:
Tue May 22, 2018 11:42 am
Er findet unter meinem raspberry System die libqt5webengine-data nicht. Alle anderen Abhaengigkeiten wurden ohne Probleme aufgeloest. Hat jemand das gleiche Problem?
Ja, wird wohl nicht oder nicht korrekt erstellt. Ich seh mir das an. Bitte etwas Geduld.
<~~>

Andreas_K
Posts: 2
Joined: Sat May 26, 2018 11:55 am

Re: TUTORIAL: Qt Crosscompile (Qt5.10.1)

Sat May 26, 2018 12:14 pm

Hallo zusammen,

ich bekomme im Schritt "Configure" in der Ubuntu VM immer folgende Fehler:

Code: Select all

...
WARNING: flex is required to build QtWebEngine.

ERROR: Feature 'opengles2' was enabled, but the pre-condition 'config.win32 || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)' failed.

ERROR: The OpenGL functionality tests failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.
andreas@andreas-VirtualBox:/opt/qt5pi/qt5build$ make 2>&1 | tee ../make.log
make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden.  Schluss.
Weiß jemand woran das liegen könnte?

Gruß Andreas

Return to “Deutsch”