{"id":917,"date":"2023-04-09T00:30:55","date_gmt":"2023-04-08T22:30:55","guid":{"rendered":"https:\/\/www.instruyete.org\/?p=917"},"modified":"2023-04-09T00:30:55","modified_gmt":"2023-04-08T22:30:55","slug":"qt-5-15-auf-raspbian-10-buster","status":"publish","type":"post","link":"https:\/\/www.instruyete.org\/?p=917","title":{"rendered":"Qt 5.15 auf Raspbian 10 (Buster)"},"content":{"rendered":"\n<p>Die Ostertage erlauben sich mal wieder mit nerdigen Sachen zu besch\u00e4ftigen und mein development Raspbi war eh notorisch unbenutzt &#8211; daher der Antritt die letzte Qt5 LTS (5.15.2) auf meinen Raspberry PI 3b zu bringen.<\/p>\n\n\n\n<p>Prim\u00e4rquellen f\u00fcr den Spa\u00df waren \u00fcbrigens:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>https:\/\/www.packtpub.com\/product\/hands-on-embedded-programming-with-qt\/9781789952063<\/li><li>https:\/\/wiki.qt.io\/RaspberryPi2EGLFS<\/li><\/ul>\n\n\n\n<p>Man merkt allerdings sehr schnell, dass das es zwar ein generelles Vorgehen gibt, die T\u00fccken aber je nach genauer Version aller beteiligten Komponenten, im Detail liegen. Der Reihe nach&#8230;<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Zuerst l\u00e4dt man sich auf dem Host Computer Qt mit dem <em>unified installer<\/em> herunter (Qt Account wird ben\u00f6tigt) und installiert neben den bin\u00e4ren Komponenten auch noch die Source (siehe snapshot <em>Qt unified installer 4.5.2<\/em>).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image.png\" alt=\"\" class=\"wp-image-919\" width=\"690\" height=\"465\" srcset=\"https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image.png 970w, https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image-300x203.png 300w, https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image-768x519.png 768w\" sizes=\"auto, (max-width: 690px) 100vw, 690px\" \/><figcaption>Qt unified installer 4.5.2<\/figcaption><\/figure>\n\n\n\n<p>In seinem $HOME Bereich erstellt man sich dann ein raspbi Arbeitsverzeichnis. Vorausgesetzt man hat die vorige Qt5 Installation auf $HOME\/Qt5 vorgenommen w\u00e4ren folgende Befehle notwendig:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir ~\/raspi\ncd ~\/raspi\ncp -r ~\/Qt5\/5.15.2\/Src qt-5.15.2-src<\/code><\/pre>\n\n\n\n<p>Um auf dem Host eine Target Zielapplikation erstellen zu k\u00f6nnen, werden neben dem Cross-Compiler (kommt sp\u00e4ter) die Systembibliotheken des Zielsystems ben\u00f6tigt. Neben den Bibliotheken ben\u00f6tigt man aber auch noch allerhand dev-packages welche die include Dateien beinhalten. Das w\u00e4ren mindestens (Liste gew\u00e4hrt sicherlich keine Vollst\u00e4ndigkeit!) folgende Pakete die man auf dem target System installieren muss:c <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>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<\/code><\/pre>\n\n\n\n<p>Dann kopiert man diese am besten auf den Host mittels folgender Kommandos<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/raspi\nmkdir sysroot sysroot\/usr sysroot\/opt\nrsync -avz pi@meinRaspi:\/lib sysroot\nrsync -avz pi@meinRaspi:\/usr\/lib sysroot\/usr\nrsync -avz pi@meinRaspi:\/usr\/include sysroot\/usr\nrsync -avz pi@meinRaspi:\/opt\/vc sysroot\/opt<\/code><\/pre>\n\n\n\n<p>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\u00e4ter beim kompilieren von Qt5 f\u00fcr das Target bei der Abh\u00e4ngigkeit von OpenGL ES 2.0.<br>Nachdem die Systembibliotheken des Target Systems nun komplett auf dem Host kopiert wurden, m\u00fcssen noch die softlinks, welche v.a. die Versionen der Bibliotheken abbilden ge\u00e4ndert 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<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/raspi\nwget https:\/\/raw.githubusercontent.com\/Kukkimonsuta\/rpi-buildqt\/master\/scripts\/utils\/sysroot-relativelinks.py\nchmod +x sysroot-relativelinks.py\n.\/sysroot-relativelinks.py sysroot<\/code><\/pre>\n\n\n\n<p>Nun kommt zumindest f\u00fcr dieses Setup der pikanteste Teil &#8211; die Auswahl des Cross-Compilers. Die meisten Quellen empfehlen (inkl. dem o.g. Embedded Qt Buch) empfehlen das installieren der Raspberry Tools von:<br>https:\/\/github.com\/raspberrypi\/tools<br>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.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"902\" height=\"471\" src=\"https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image-1.png\" alt=\"\" class=\"wp-image-923\" srcset=\"https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image-1.png 902w, https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image-1-300x157.png 300w, https:\/\/www.instruyete.org\/wp-content\/uploads\/2023\/04\/image-1-768x401.png 768w\" sizes=\"auto, (max-width: 902px) 100vw, 902px\" \/><figcaption>Hinweis auf https:\/\/github.com\/raspberrypi\/tools\/<\/figcaption><\/figure>\n\n\n\n<p>Das erstgenannte Paket gibt es allerdings &#8211; auf Ubuntu 20.04 LTS &#8211; meinem Host System nur in den gcc Serien 8.x, 9.x und 10.x<br>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 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/raspi\/qt-5.15.2-src\/qtbase\/mkspecs\/devices\/common\/linux_device_pre.conf<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>die compiler mit dem postfix -8 versehen (g++-8). Zwar lief der configure Schritt durch, doch w\u00e4hrend des compilers traten in den target Systembilbiotheken <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>libpthread<\/li><li>librt<\/li><\/ul>\n\n\n\n<p>unresolved symbols auf. Den genauen Hintergrund dieser Inkompatibilit\u00e4t wollte ich nicht mehr untersuchen.<\/p>\n<\/div><\/div>\n\n\n\n<p>Die L\u00f6sung ist von Linaro den letzten verf\u00fcgbaren gcc Compiler der 7er Serie zu nehmen. Dies findet man unter<br><a href=\"https:\/\/releases.linaro.org\/components\/toolchain\/binaries\/\">https:\/\/releases.linaro.org\/components\/toolchain\/binaries\/<\/a><br>Gr\u00fc\u00dfe gehen an folgende franz\u00f6sische Webseite<br><a href=\"https:\/\/ebsolution31.wordpress.com\/2020\/10\/08\/cross-compile-qt\/\">https:\/\/ebsolution31.wordpress.com\/2020\/10\/08\/cross-compile-qt\/<\/a><\/p>\n\n\n\n<p>Das entpacken des dort vorhandenen .zip Files passiert direkt in ~\/raspi<br>Mit dem  folgenden Kommandos &#8211; in einem out-of-source build, kann dann endlich eine Qt 5.15 Version f\u00fcr den Raspberry PI 3B gebaut werden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/raspi\nmkdir build-raspi\ncd build-raspi\n..\/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\nmake -j 4\nmake install<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Die Ostertage erlauben sich mal wieder mit nerdigen Sachen zu besch\u00e4ftigen und mein development Raspbi war eh notorisch unbenutzt &#8211; daher der Antritt die letzte Qt5 LTS (5.15.2) auf meinen Raspberry PI 3b zu bringen. Prim\u00e4rquellen f\u00fcr den Spa\u00df waren \u00fcbrigens: 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 &hellip; <a href=\"https:\/\/www.instruyete.org\/?p=917\" class=\"more-link\"><span class=\"screen-reader-text\">Qt 5.15 auf Raspbian 10 (Buster)<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,26,7],"tags":[],"class_list":["post-917","post","type-post","status-publish","format-standard","hentry","category-linux","category-raspberry-pi","category-unix"],"_links":{"self":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/917","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=917"}],"version-history":[{"count":7,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/917\/revisions"}],"predecessor-version":[{"id":926,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/917\/revisions\/926"}],"wp:attachment":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}