Qt 5.15 auf Raspbian 10 (Buster)

Die Ostertage erlauben sich mal wieder mit nerdigen Sachen zu beschäftigen und mein development Raspbi war eh notorisch unbenutzt – daher der Antritt die letzte Qt5 LTS (5.15.2) auf meinen Raspberry PI 3b zu bringen.

Primärquellen für den Spaß waren übrigens:

  • https://www.packtpub.com/product/hands-on-embedded-programming-with-qt/9781789952063
  • https://wiki.qt.io/RaspberryPi2EGLFS

Man merkt allerdings sehr schnell, dass das es zwar ein generelles Vorgehen gibt, die Tücken aber je nach genauer Version aller beteiligten Komponenten, im Detail liegen. Der Reihe nach…

Zuerst lädt man sich auf dem Host Computer Qt mit dem unified installer herunter (Qt Account wird benötigt) und installiert neben den binären Komponenten auch noch die Source (siehe snapshot Qt unified installer 4.5.2).

Qt unified installer 4.5.2

In seinem $HOME Bereich erstellt man sich dann ein raspbi Arbeitsverzeichnis. Vorausgesetzt man hat die vorige Qt5 Installation auf $HOME/Qt5 vorgenommen wären folgende Befehle notwendig:

mkdir ~/raspi
cd ~/raspi
cp -r ~/Qt5/5.15.2/Src qt-5.15.2-src

Um auf dem Host eine Target Zielapplikation erstellen zu können, werden neben dem Cross-Compiler (kommt später) die Systembibliotheken des Zielsystems benötigt. Neben den Bibliotheken benötigt man aber auch noch allerhand dev-packages welche die include Dateien beinhalten. Das wären mindestens (Liste gewährt sicherlich keine Vollständigkeit!) folgende Pakete die man auf dem target System installieren muss:c

sudo apt install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 xserver-xorg-input-evdev xserver-xorg-input-libinput-dev libx11-dev libegl-dev libevdev-dev

Dann kopiert man diese am besten auf den Host mittels folgender Kommandos

cd ~/raspi
mkdir sysroot sysroot/usr sysroot/opt
rsync -avz pi@meinRaspi:/lib sysroot
rsync -avz pi@meinRaspi:/usr/lib sysroot/usr
rsync -avz pi@meinRaspi:/usr/include sysroot/usr
rsync -avz pi@meinRaspi:/opt/vc sysroot/opt

Der letztgenannte Ordner beinhaltet auf Raspbian Systemen die Komponeten des Grafik-Subsystems. Falls man statt Raspbian ein Yocto-basierendes OS aufsetzt existiert dieses Verzeichnis nicht. Man merkt den Unterschied später beim kompilieren von Qt5 für das Target bei der Abhängigkeit von OpenGL ES 2.0.
Nachdem die Systembibliotheken des Target Systems nun komplett auf dem Host kopiert wurden, müssen noch die softlinks, welche v.a. die Versionen der Bibliotheken abbilden geändert werden. Hintergrund ist, dass diese meistens mit absoluten Pfaden arbeiten, was hier auf relative Pfade umgebogen werden muss. Dazu benutzt man ein python-basierendes Script

cd ~/raspi
wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

Nun kommt zumindest für dieses Setup der pikanteste Teil – die Auswahl des Cross-Compilers. Die meisten Quellen empfehlen (inkl. dem o.g. Embedded Qt Buch) empfehlen das installieren der Raspberry Tools von:
https://github.com/raspberrypi/tools
Allerdings ist diese Toolchain schon sehr alt (gcc 4.x) und Qt 5.15.2 bricht beim Kompilieren ab. Interessanterweise ist ja schon auf der Frontpage des Projektes der Hinweis, dass diese Toolchain deprecated ist und durch GNU/Linux-Bordmittel ersetzt wurde.

Hinweis auf https://github.com/raspberrypi/tools/

Das erstgenannte Paket gibt es allerdings – auf Ubuntu 20.04 LTS – meinem Host System nur in den gcc Serien 8.x, 9.x und 10.x
Das glibc des target Zielsystem basiert auf gcc 8.3, also sollte der cross-compiler vom host System eigentlich passen auch wenn dieser die minor Version 8.4 hat. Also habe ich ihn installiert und beim Qt cross-compile in der

~/raspi/qt-5.15.2-src/qtbase/mkspecs/devices/common/linux_device_pre.conf

die compiler mit dem postfix -8 versehen (g++-8). Zwar lief der configure Schritt durch, doch während des compilers traten in den target Systembilbiotheken

  • libpthread
  • librt

unresolved symbols auf. Den genauen Hintergrund dieser Inkompatibilität wollte ich nicht mehr untersuchen.

Die Lösung ist von Linaro den letzten verfügbaren gcc Compiler der 7er Serie zu nehmen. Dies findet man unter
https://releases.linaro.org/components/toolchain/binaries/
Grüße gehen an folgende französische Webseite
https://ebsolution31.wordpress.com/2020/10/08/cross-compile-qt/

Das entpacken des dort vorhandenen .zip Files passiert direkt in ~/raspi
Mit dem folgenden Kommandos – in einem out-of-source build, kann dann endlich eine Qt 5.15 Version für den Raspberry PI 3B gebaut werden.

cd ~/raspi
mkdir build-raspi
cd build-raspi
../qt-5.15.2-src/configure -release -opengl es2 -device linux-rasp-pi3-vc4-g++ -device-option CROSS_COMPILE=~/raspi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/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 -qt-sqlite -skip qtscript
make -j 4
make install

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.