Wenn man für den Raspberry Pi eine grafische Oberfläche entwickeln möchte, landet man in den allermeisten Fällen bei Lösung, die mit Qt realisiert werden. Hierbei handelt es sich um eine universelle C++ Bibliothek zum Erstellen von grafischen Oberflächen für verschiedene Betriebssysteme, wie z. B. Windows, Linux oder Android.
Leider bietet ein Raspberry Pi nicht sehr viel Rechenleistung, weshalb das Entwickeln von grafischen Oberflächen auf dem Raspberry Pi eher unschön ist. Ein deutlich eleganterer Weg wäre es, wenn das Programm auf einem Host-PC entwickelt und dann per Remoteverbindung auf den Raspberry Pi kopiert und ausgeführt wird.
Und genau das soll Thema dieser Anleitung sein. Ich werde zeigen, wie der Raspberry Pi und ein Ubuntu Host-System genutzt werden können, um auf dem Host-System Qt-Applikationen für den Raspberry Pi zu entwickeln, die dann Remote auf dem Raspberry Pi ausgeführt werden.
Den Raspberry Pi vorbereiten:
Für einen reibungslosen Ablauf muss das Betriebssystem (hier Raspbian) auf dem Raspberry Pi auf den aktuellen Stand gebracht werden. Dazu muss zuerst die Datei /etc/apt/sources.list
angepasst und Debian-Quellpakete zugelassen werden:
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
Anschließend werden die Paketliste, die Pakete und das Betriebssystem des Raspberry Pi aktualisiert:
$ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo rpi-update $ sudo reboot
Dann werden die fehlenden Pakete installiert:
$ 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
Und zu guter Letzt wird noch ein Ordner für die Qt-Installation angelegt und die fehlenden Symlinks erstellt:
$ sudo mkdir /usr/local/RaspberryQt $ sudo chown -R pi:pi /usr/local/RaspberryQt $ ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 $ ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 $ ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1 $ ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2
Damit ist die Konfiguration des Raspberry Pi abgeschlossen. Weiter geht es mit dem Host…
Qt für den Raspberry Pi kompilieren:
Für das Host-System habe ich ein Ubuntu 18.04 LTS in einer virtuellen Maschine genutzt. Auch hier müssen zu Beginn erst einmal die Paketquellen und die Pakete aktualisiert und ein paar zusätzliche Pakete installiert werden.
$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" $ sudo apt update $ sudo apt-get install -y flex libjasper-dev git cmake build-essential pkg-config libjpeg-dev libtiff5-dev libpng-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran wget unzip libz-dev zlib1g-dev gcc g++ git bison python gperf gdb-multiarch qt5-default texinfo make python3-dev
Anschließend werden die Arbeitsverzeichnisse angelegt und die Rechte entsprechend konfiguriert:
$ sudo mkdir /opt/RaspberryQt $ sudo mkdir /opt/RaspberryQt/build $ sudo mkdir /opt/RaspberryQt/sysroot /opt/RaspberryQt/sysroot/usr /opt/RaspberryQt/sysroot/opt $ sudo chown -R 1000:1000 /opt/RaspberryQt
Für ein einfacheres Arbeiten wird dann noch ein SSH-Schlüssel für den Raspberry Pi erstellt, wodurch lästige Passworteingaben beim Kopieren der Daten vermieden werden.
$ ssh-keygen -t rsa -C root@<IP Raspberry Pi> -P "" -f ~/.ssh/rpi_root_id_rsa $ ssh-keygen -t rsa -C pi@<IP Raspberry Pi> -P "" -f ~/.ssh/rpi_pi_id_rsa $ cat ~/.ssh/rpi_root_id_rsa.pub | ssh root@<IP Raspberry Pi> 'cat >> .ssh/authorized_keys && chmod 640 .ssh/authorized_keys' $ cat ~/.ssh/rpi_pi_id_rsa.pub | ssh pi@<IP Raspberry Pi> 'cat >> .ssh/authorized_keys && chmod 640 .ssh/authorized_keys'
Danach können die notwendigen Dateien heruntergeladen werden.
$ cd /opt/RaspberryQt $ git clone https://github.com/raspberrypi/tools $ wget https://download.qt.io/archive/qt/5.12/5.12.8/single/qt-everywhere-src-5.12.8.tar.xz $ wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
Bei den Dateien handelt es sich um den Cross-Compiler für den Raspberry Pi, die verwendete Qt Version (hier 5.12.8) und ein Python-Skript um symbolische Links von Dateien durch relative Links zu ersetzen (wird später benötigt).
Anschließend wird die Qt-Version entpackt und der Name des verwendeten Compilers (hier arm-linux-gnueabihf
) in der Konfigurationsdatei von Qt angepasst.
$ tar xf qt-everywhere-src-5.12.8.tar.xz $ cp -R qt-everywhere-src-5.12.8/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.12.8/qtbase/mkspecs/linux-arm-gnueabihf-g++ $ sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.12.8/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf
Nun werden noch die verwendeten Bibliotheken vom Target (hier der Raspberry Pi) Pi benötigt. Diese können mittels rsync
vom Raspberry Pi heruntergeladen werden.
$ rsync -avz root@<IP vom Raspberry Pi>:/lib sysroot $ rsync -avz root@<IP vom Raspberry Pi>:/usr/include sysroot/usr $ rsync -avz root@<IP vom Raspberry Pi>:/usr/lib sysroot/usr $ rsync -avz root@<IP vom Raspberry Pi>:/opt/vc sysroot/opt
Das Herunterladen kann mitunter ein paar Minuten dauern. Diese Dateien werden nachher für den Build-Prozess von Qt benötigt, da Qt einige Standardbibliotheken vom Zielsystem (hier der Raspberry Pi) benötigt.
Bevor die Dateien genutzt werden können, müssen noch einige Dateilinks, u. a. welche die auf das Dateisystem des Raspberry Pi zeigen, durch neue Links ersetzt werden.
/opt/RaspberryQt/sysroot-relativelinks.py sysroot
Dann wird Qt konfiguriert.
$ cd /opt/RaspberryQt/build $ ../qt-everywhere-src-5.12.8/configure -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=/opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot /opt/RaspberryQt/sysroot -prefix /usr/local/RaspberryQt -opensource -confirm-license -no-gbm -skip qtscript -nomake tests -nomake examples -make libs -pkg-config -no-use-gold-linker -v
Bei der Konfiguration muss über den Parameter des Arguments -device
der Typ des Targets angegeben werden. Für die Parameter gilt die nachfolgende Tabelle.
Sobald die Konfiguration abgeschlossen ist, kann Qt kompiliert und installiert werden.
$ make -j4 $ make install
Über den Parameter -j4
gibt man die Anzahl der verwendeten Kerne an, wodurch der Prozess beschleunigt werden kann. Mit einem Kern dauert der komplette Vorgang gute 3-4 h (je nach System).
Die fertig kompilierten Qt-Bibliotheken werden abschließend mittels rsync
auf den Raspberry Pi kopiert.
$ cd /opt/RaspberryQt $ rsync -avz sysroot/usr/local/RaspberryQt root@<IP des Raspberry Pi>:/usr/local
Die Qt-Bibliotheken und der Raspberry Pi sind damit einsatzbereit. und auf dem Raspberry Pi können jetzt bereits Qt-Anwendungen erstellt, kompiliert und ausgeführt werden.
Als nächstes muss ein neuer GDB erstellt werden, da der GDB aus der Raspberry Pi Toolchain keine Unterstützung für die Programmiersprache Python mitbringt und deswegen nicht im Qt Creator genutzt werden kann.
GDB kompilieren:
Bevor GDB kompiliert werden kann, müssen ein paar zusätzliche Pakete installiert werden:
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install -y texinfo gcc g++ make python3-dev wget
Die Sourcen für GDB können mit dem Befehl wget
direkt vom FTP-Server des GNU-Projektes heruntergeladen werden:
$ wget https://ftp.gnu.org/gnu/gdb/gdb-9.1.tar.xz $ tar xf gdb-9.1.tar.xz $ mkdir gdb-9.1/build
Für die Erstellung von GDB werden die installierte Python-Version, sowie die entsprechenden Python-Bibliotheken benötigt:
$ export PYTHON=python3 $ export PYTHON_LIBDIR=$("${PYTHON}" -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))")
Jetzt kann GDB konfiguriert und erstellt werden:
$ cd gdb-9.1/build $ ../configure --prefix=/home/kampi/GDB/bin --target=arm-linux-gnueabihf --with-python=${PYTHON} LDFLAGS="-L${PYTHON_LIBDIR}" $ make -j4 $ make -C gdb install
Die erstellte GDB-Version wird am Ende des Kompiliervorgangs im Verzeichnis bin/
gespeichert.
Damit wären die Werkzeuge vollständig. Im nächsten Schritt zeige ich dann, wie der Qt Creator eingerichtet wird.
Einrichten des Qt Creators auf dem Host-System:
Für die Entwicklung von Qt-Anwendungen eignet sich der Qt Creator am besten. Da die Installation über die offiziellen Ubuntu Paketquellen bei mir nicht funktioniert hat und der Qt Creator immer abstützt, habe ich mir den Qt-Installer direkt von der Webseite heruntergeladen und ausgeführt.
$ cd ~/Downloads $ sudo chmod +x qt-unified-linux-x64-3.2.2-online.run $ ./qt-unified-linux-x64-3.2.2-online.run
Hinweis:
Dieser Schritt installiert die kompletten Qt-Bibliotheken, etc. auf dem Host-System und nicht nur den Qt Creator.
Nach der Installation muss der Qt Creator noch für den Raspberry Pi konfiguriert werden. Dazu wird der Creator gestartet und das Menü Extras → Einstellungen geöffnet. Anschließend wird das Untermenü Geräte geöffnet und auf Hinzufügen… geklickt um ein neues Generisches Linux-Gerät hinzuzufügen.
Über den Button Assistent starten wird die Auswahl bestätigt und ein neues Gerät angelegt. Für die SSH-Verbindung kann die bereits angelegte Schlüsseldatei verwendet werden. Über Weiter → Abschließen wird die Einrichtung des neuen Gerätes abgeschlossen. Der Qt Creator testet daraufhin die Einstellungen und versucht eine Verbindung zu dem Gerät herzustellen.
Wenn der Test erfolgreich war, kann das Fenster geschlossen werden. Das neue Gerät wird nun in der Geräteliste aufgeführt.
Danach wird das Kit, also die Sammlung aus Compiler, Debugger und Quellen erstellt. Über Extras wird wieder das Menü Einstellungen geöffnet und der Punkt Kits ausgewählt. In dem Reiter Compiler wird durch den Button Hinzufügen ein Eintrag für einen C- und ein C++Compiler (beide unter GCC zu finden) hinzugefügt.
Mit einem Klick auf Anwenden werden die Eingaben dann bestätigt.
Als nächstes wird die Qt-Version für den Raspberry Pi angelegt. Dazu wird der Reiter Qt Versionen geöffnet und über den Button Hinzufügen wird dann ein neuer Eintrag angelegt. Es öffnet sich ein Dateibrowser, mit dem der Pfad des erstellten qmake
ausgewählt wird.
Die Eingabe wird mit einem Klick auf den Button Anwenden bestätigt.
Im letzten Schritt wird noch ein neuer Debugger angelegt. Dazu wird der Reiter Debugger geöffnet und über den Button Hinzufügen ein neuer Eintrag erstellt und mit dem Pfad des erstellten Debuggers ausgefüllt.
Jetzt kann das Kit erstellt werden. Dazu wird der Reiter Kits geöffnet und über den Button Hinzufügen wird dann ein neues Kit angelegt. Die Maske wird nun entsprechend dem Screenshot ausgefüllt.
Auch hier wird die Eingabe mit einem Klick auf Anwenden bestätigt. Anschließend kann das Fenster über OK geschlossen werden.
Erstellen eines Testprojektes:
Jetzt, da alle Werkzeuge beisammen sind, soll auch mal ein Beispielprojekt auf dem Ubuntu Host-System entwickelt und Remote auf dem Raspberry Pi ausgeführt werden. Über Datei → Neu… wird ein neues Qt-Widgets Projekt angelegt. Die einzelnen Eingaben werden mit Weiter bestätigt. Bei der Kitauswahl wird eben erstellte Raspberry Pi Kit als Kit ausgewählt.
Alle weiteren Eingaben können direkt mit Weiter bestätigt und der Assistent anschließend mit Abschließen beendet werden.
Als nächstes muss in der Projektdatei die Deployment-Regel angepasst werden, da der User pi standardmäßig nicht auf das voreingestellte Verzeichnis /opt
zugreifen darf. Daher wird der Pfad in /home/pi
geändert.
target.path = /home/pi/$${TARGET}/bin INSTALLS += target
In dem erstellten Projekt müssen dann noch zwei Umgebungsvariablen für das Target, also den Raspberry Pi, gesetzt werden. Dazu wird der Reiter Projekte geöffnet und der Punkt Ausführen des aktuellen Kits ausgewählt. In dem Untermenü Ausführungsumgebung werden die Variablen DISPLAY=:0
und XAUTHORITY=/home/pi/.Xauthority
erstellt und gesetzt.
Zudem muss unter dem Punkt Ausführen der Kommandozeilenparameter -platform xcb
gesetzt werden.
Hinweis:
In der Standardkonfiguration verwendet Qt für Embedded Linux eglfs zum Rendern der Fenster, wodurch kein Displayserver wie X11 oder Wayland benötigt wird. Daher starten die Anwendungen immer im Vollbildmodus und können nicht minimiert oder in den Hintergrund geschoben werden. Wenn egl genutzt werden soll, muss noch die Größe des Bildschirms definiert werden. Dies erfolgt mit Hilfe der Umgebungsvariablen QT_QPA_EGLFS_PHYSICAL_WIDTH
, QT_QPA_EGLFS_PHYSICAL_HEIGHT
, QT_QPA_EGLFS_HEIGHT
und QT_QPA_EGLFS_WIDTH
.
Im Falle des offiziellen Raspberry Pi Bildschirms kann die Größe des Bildschirms kann der offiziellen Zeichnung entnommen werden. Die eingetragenen Werte entsprechen der Größe des Bildschirms in Millimetern und Pixeln! Bei anderen Bildschirmen müssen die Werte entsprechend angepasst werden.
Zudem müssen auf dem Raspberry Pi noch zwei Pfade angepasst werden:
$ cd /opt/vc/lib $ sudo ln -s libbrcmEGL.so libEGL.so.1 $ sudo ln -s libbrcmGLESv2.so libGLESv2.so.2 $ echo "export LD_LIBRARY_PATH=/opt/vc/lib" >> ~/.bashrc
Damit ist das Setup einsatzbereit und dem Entwickeln von grafischen Anwendungen auf dem PC für den Raspberry Pi steht nichts mehr im Wege. Mit einen Klick auf den grünen Pfeil in der seitlichen Leiste oder mit der Tastenkombination Strg + R wird das Projekt erstellt und die Anwendung ein paar Sekunden später auf dem Raspberry Pi gestartet.
Hinzufügen neuer Module:
Bei der durchgeführten Installation handelt es sich um eine Minimalinstallation, bei der nicht alle Module vorhanden sind (es fehlen z. B. die Qt Charts). Diese Module können nachträglich installiert werden, indem die Quellen des jeweiligen Moduls aus dem Verzeichnis submodules
der jeweiligen Qt-Version heruntergeladen werden (nachfolgend für Qt Charts durchgeführt):
$ wget http://download.qt.io/official_releases/qt/5.12/5.12.8/submodules/qtcharts-everywhere-src-5.12.8.tar.xz $ tar xf qtcharts-everywhere-src-5.12.8.tar.xz
Nach dem Entpacken wird in das Verzeichnis gewechselt und die Installation gestartet. Hierfür wird der Pfad des erstellten qmake
benötigt:
$ cd qtcharts-everywhere-src-5.12.8 $ /opt/RaspberryQt/sysroot/usr/local/RaspberryQt/bin/qmake $ make $ make install
Die erstellten Bibliotheken müssen dann wieder mittels rsync
auf den Raspberry Pi kopiert werden.
$ rsync -avz /opt/RaspberryQt/sysroot/usr/local/RaspberryQt root@$<IP des Raspberry Pi>:/usr/local
Und schon ist das zusätzliche Modul einsatzbereit.
Für die einzelnen Schritte habe ich Bash-Skripte angefertigt, die die kompletten Abläufe enthalten (sowohl für den Raspberry Pi, als auch für das Host-System). Die Skripte und das Beispielprojekt findet ihr in meinem GitHub-Repository.
Funktioniert bei mir in einer virtuellen maschine mit debian9 32-bit leider nur bis zu dem Punkt, an dem Qt5 konfiguriert werden soll:
Project ERROR: Cannot run target compiler ‚/opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++‘. Output:
===================
sh: 1: /opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++: not found
===================
Maybe you forgot to setup the environment?
Hallo Michael,
liegt den die Raspberry Pi Toolchain an dem angegebenen Pfad?
Das klingt nicht wie ein Problem mit dem Debian, sondern einfach nach einem falschen Pfad.
Gruß
Daniel
ja, sie ist genau dort vorhanden!
Stimmen die Rechte auch? Kannst du als aktueller Nutzer den Compiler ausführen?
Nein, nicht ausführbar! Das liegt vermutlich daran, dass ich in der virtuellen Maschine mit einem 32-bit System arbeite.
Ich habe es nochmal auf meinem realen Ubuntu 18 mit Deinen Bash-Scripten versucht – schlug auch fehl.
Ein neuer Versuch Schritt-für-Schritt „by hand“ nach dieser Anleitung, ebenfalls auf Ubutntu 18 64-bit, brachte mich dann endlich soweit, dass Qt konfiguriert werden konnte. Compilierung läuft gerade…
Mmh komisch. Der Compiler sollte doch die 32-Bit Version sein…
Naja okay. Was gab es den für einen Fehler beim Skript? Ich hab das die Tage noch etwas modifiziert und noch 2x bei mir getestet und da lief es.
Gruß
Daniel
Hallo,
ich habe genau das selbe Problem unter Ubuntu 64-bit. Die Datei liegt wo sie soll, ausführen kann ich sie aber nicht.
Project ERROR: Cannot run target compiler ‚/opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihfg++‘. Output:
===================
sh: 1: /opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihfg++: not found
===================
Maybe you forgot to setup the environment?
Leider habe ich keine Ahnung wie ich hier was Schritt-für-Schritt by hand durchführen kann.
Gruß
Markus
Hallo Markus,
ich glaube in dem Skript von mir fehlt eine Zeile…
Kannst du mal bitte ausprobieren ob das Problem behoben wird, wenn du
export PATH=$PATH:/opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
eingibst?
Ggf. ist das schon der Fehler. Das „blöde“ an Umgebungsvariablen ist halt, dass sie bis zum Reboot gesetzt bleiben, wenn man sie setzt. Und ich habe, während ich das Skript geschrieben habe, keinen Reboot durchgeführt :)
Danke und Gruß
Daniel
Hallo Daniel,
das hat leider nicht geholfen. Ich habe immer noch den selben Fehler.
Gruß
Markus
Hallo Markus,
also ich habe gerade eine neue Ubuntu VM aufgesetzt und mein Installationsskript verwendet:
https://gitlab.com/Kampi/Raspberry-Pi/blob/master/Bash/CompileQt_Host.sh
Damit wird Qt kompiliert (ob es fehlerfrei durchläuft habe ich jetzt noch nicht getestet, aber es wurde erfolgreich konfiguriert:
Configure summary:
Building on: linux-g++ (x86_64, CPU features: mmx sse sse2)
Building for: devices/linux-rasp-pi3-g++ (arm CPU features: neon)
Ggf. ist ein Fehler in der Anleitung. Diesen habe ich aber bisher nicht gefunden. Ich werde die Anleitung die Tage mal durchspielen und verifizieren. Bis dahin kannst du das Shell-Skript nutzen um Qt zu installieren.
Gruß
Daniel
Hallo Daniel,
Ich habe es nun geschafft!
Mit
nano ~/.bashrc
die Datei .bashrc geöffnet und am Ende
export PATH=$PATH:/opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
eingefügt. Dann Qt mit:
../qt-everywhere-src-5.10.1/configure -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=/opt/RaspberryQt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot /opt/RaspberryQt/sysroot -prefix /usr/local/RaspberryQt -opensource -confirm-license -no-gbm -skip qtscript -nomake tests -nomake examples -make libs -pkg-config -no-use-gold-linker -v
konfiguriert. Ich habe also gcc-linaro-arm-linux-gnueabihf-raspbian-x64 genutzt.
Ich hatte noch weitere Probleme. Und zwar hiermit:
rsync -avz pi@$:/usr/lib sysroot/usr
Ich hatte folgende Fehlermeldung:
Fehler: rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1668) [generator=3.1.2]
Erst nachdem ich root Rechte auf dem RasbPi eingerichtet habe und mit:
rsync -avz root@raspberrypi:/usr/lib sysroot/usr
die Dateien kopiert habe wurden alle kopiert.
Jetzt läuft alles wie es soll. Ich danke Dir vielmals für das Einstellen des Tutorials und deinen Einsatz nachdem es bei mir erstmal nicht funktioniert hat. Weiter so!
Gruß
Markus
Hallo Markus,
danke für das Feedback. Ich werde das anpassen und korrigieren :)
Edit: Ich sehe gerade, dass das im Installationsskript bereits geändert ist. In der Anleitung wurde nur an dieser einen Stelle nicht die x64 Version des Compilers verwendet. Doofer Fehler, aber ich habe es korrigiert. Dank dir für deine Mühe und das Feedback. Dann muss ich es heute nicht mehr ausprobieren und den Fehler suchen :)
Ein kleiner Hinweis noch…
Das Export benötigst du nicht, wenn du den kompletten Pfad zum Compiler angibst. Du kannst entweder einen relativen Pfad angeben und die PATH-Variable benutzen oder den kompletten ohne PATH.
Gruß
Daniel
Hallo Daniel,
Danke dir für das Tutorial. Ich versuche mich gerade deine Methode für Qt Cross-Compiling in BananaPi zu benutzen.
Bis zu ./configure funktioniert alles super, aber bei der Befehl make bekomme ich immer noch Probleme wie:
.obj/qopengl.o:qopengl.cpp:function QOpenGLConfig::gpuFeatures(QOpenGLConfig::Gpu const&, QJsonDocument const&): Fehler: undefined reference to ‚QSysInfo::kernelVersion()‘
.obj/qopengl.o:qopengl.cpp:function QOpenGLConfig::gpuFeatures(QOpenGLConfig::Gpu const&, QJsonDocument const&): Fehler: undefined reference to ‚QVersionNumber::fromString(QString const&, int*)‘
.obj/qopengl.o:qopengl.cpp:function QOpenGLConfig::gpuFeatures(QOpenGLConfig::Gpu const&, QString const&): Fehler: undefined reference to ‚QSysInfo::kernelVersion()‘
.obj/qopengl.o:qopengl.cpp:function QOpenGLConfig::gpuFeatures(QOpenGLConfig::Gpu const&, QString const&): Fehler: undefined reference to ‚QVersionNumber::fromString(QString const&, int*)‘
collect2: Fehler: ld gab 1 als Ende-Status zurück
make[2]: *** [Makefile:1127: ../../lib/libQt5Gui.so.5.6.4] Fehler 1
make[2]: Verzeichnis „/opt/raspi/qtbase/src/gui“ wird verlassen
make[1]: *** [Makefile:499: sub-gui-make_first] Fehler 2
make[1]: Verzeichnis „/opt/raspi/qtbase/src“ wird verlassen
make: *** [Makefile:47: sub-src-make_first] Fehler 2
Irgendwie wird für viele Befehle von der Qt selbst keine Referenz gefunden werden.
Ich habe erstmal gedacht, dass der Toolchain von BananaPi ist unterschiedlich als für RPi und deswegen läuft das Make-Befehl schief, aber von den Fehlermeldungen sieht es aus, dass das Problem liegt bei dem Qt. Ich habe auch schon versuchen die Libraries in Host-PC zu aktualisieren und neue Abhängigkeiten zu installieren, funktionieren aber immer noch nicht. Hast du vielleicht Idee was schief gelaufen hat bei den?
Ich benutze gerade Qt version 5.6.0 und Raspbian Jessie.
Gruß
Widi
Hallo Widi,
vielleicht wird die Version nicht unterstützt. Hast du mal eine ältere ausprobiert?
Gruß
Daniel
Hallo Daniel,
danke für den Hinweis, ich habe mit Qt Version 5.3.2 nochmal probiert, und funktioniert jetzt den make-Befehl.
Zum Kompilieren in Banana Pi wird aber eine Fehlermeldung
* failed to open vchiq device
angezeigt.
Kann es vielleicht wegen falsche Compiler liegen?
Gruß
Widi
Hallo Widi,
bitte entschuldige die späte Antwort, aber ich hatte dich komplett vergessen…
Hast du das Problem mittlerweile gelöst?
Ansonsten schau mal ob du ein „dev/vchiq“ hast.
Gruß
Daniel
Hallo Daniel,
Sorry auch für die sehr späte Antwort. Das Problem wird noch nicht gelöst, weil das „dev/chiq/“ ist ein spezifischer Treiber für RasPi, BananaPi ist nicht kompatibel mit diesem Treiber. Aber ich kompiliere das Qt momentan direkt in BananaPi, und funktioniert super, die Kompilierung läuft nur langsam.
Danke für deine Hilfe :)
Gruß,
Widi
Hallo Widi,
freut mich das es nun funktioniert (wenn auch langsam ;)). Viel Spaß mit Qt.
Gruß
Daniel
Hallo Kampi,
erst einmal vielen Dank für deine Anleitung! Sie ist sehr ausführlich.
Zunächst würde ich mich selbst als blutigen Anfänger bezeichnen, weshalb vielleicht mein Problem recht simpel ist, ich aber auch nach längerem Googlen nicht weiter bin… Ich versuche gerade den Cross-Compile zwischen einem Raspberry Pi 3 mit Raspbian in der Version vom July 2019 und einer Virtuellen Maschine mit Ubuntu 19.04 einzurichten.
Hierbei ist mir zunächst aufgefallen, dass QT 5.10.1 nicht mehr unter dem in der Beschreibung angegebenen Link zu finden ist. Der aktuelle wäre vermutlich:
https://download.qt.io/archive/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz
Des Weiteren musste ich im Raspberry Pi SSH config den Root Zugriff erlauben. (evtl. ist das aber auch nur in meinem speziellen Fall nötig)
Als ich nun Qt konfigurieren wollte habe ich den unten stehenden Fehler bekommen. Was will mir das sagen?
Vielen Dank schonmal für deine Hilfe.
/opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:101:12: error: ‘int renameat2(int, const char*, int, const char*, unsigned int)’ was declared ‘extern’ and later ‘static’ [-fpermissive]
static int renameat2(int oldfd, const char *oldpath, int newfd, const char *newpath, unsigned flags)
^~~~~~~~~
In file included from /usr/include/c++/8/cstdio:42,
from /usr/include/c++/8/ext/string_conversions.h:43,
from /usr/include/c++/8/bits/basic_string.h:6400,
from /usr/include/c++/8/string:52,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/../../src/corelib/tools/qbytearray.h:52,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/qbytearray.h:1,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/../../src/corelib/tools/qstring.h:49,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/qstring.h:1,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/../../src/corelib/io/qiodevice.h:50,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/qiodevice.h:1,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/../../src/corelib/io/qfiledevice.h:43,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/include/QtCore/qfiledevice.h:1,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfile.h:44,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_p.h:54,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:43:
/usr/include/stdio.h:164:12: note: previous declaration of ‘int renameat2(int, const char*, int, const char*, unsigned int)’
extern int renameat2 (int __oldfd, const char *__old, int __newfd,
^~~~~~~~~
In file included from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:106:
/usr/include/linux/stat.h:56:8: error: redefinition of ‘struct statx_timestamp’
struct statx_timestamp {
^~~~~~~~~~~~~~~
In file included from /usr/include/x86_64-linux-gnu/sys/stat.h:446,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-g++/qplatformdefs.h:75,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:42:
/usr/include/x86_64-linux-gnu/bits/statx.h:25:8: note: previous definition of ‘struct statx_timestamp’
struct statx_timestamp
^~~~~~~~~~~~~~~
In file included from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:106:
/usr/include/linux/stat.h:99:8: error: redefinition of ‘struct statx’
struct statx {
^~~~~
In file included from /usr/include/x86_64-linux-gnu/sys/stat.h:446,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-g++/qplatformdefs.h:75,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:42:
/usr/include/x86_64-linux-gnu/bits/statx.h:36:8: note: previous definition of ‘struct statx’
struct statx
^~~~~
/opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:107:12: error: ‘int statx(int, const char*, int, unsigned int, statx*)’ was declared ‘extern’ and later ‘static’ [-fpermissive]
static int statx(int dirfd, const char *pathname, int flag, unsigned mask, struct statx *statxbuf)
^~~~~
In file included from /usr/include/x86_64-linux-gnu/sys/stat.h:446,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-g++/qplatformdefs.h:75,
from /opt/RaspberryQt/qt-everywhere-src-5.10.1/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:42:
/usr/include/x86_64-linux-gnu/bits/statx.h:87:5: note: previous declaration of ‘int statx(int, const char*, int, unsigned int, statx*)’
int statx (int __dirfd, const char *__restrict __path, int __flags,
^~~~~
make: *** [Makefile:429: qfilesystemengine_unix.o] Fehler 1
Hallo Pascal,
ja, der Link ist nicht mehr gültig, da die Version wohl mitlerweile ins Archiv verschoben wurde. Dein aktueller Link ist korrekt. Auch das du SSH für den root-Zugriff konfigurieren musst ist normal. Der Benutzername ist per Default im SSH deaktiviert. Kannst du mal die komplette Ausgabe (also auch die Eingabe des „configure“ Befehls) in eine Textdatei kopieren und mir die zukommen lassen?
Gruß
Daniel
Hallo Daniel,
hast Du dafür eine Lösung gefunden?
Ich stehe nämlich gerade vor dem gleichen Problem wie Pascal und wäre für jeden Tip dankbar.
Grüße
Hartmut
Hallo Harmut,
nein, weil nach meinem Kommentar leider kein Feedback erfolgt ist.
Was ist den dein Problem? Schreib mir das bitte per Mail, dann kann man sich das mal anschauen.
Gruß
Daniel
Hallo Kampis,
zunächst mal herzlichen Dank für dieses Tutorial. Es ist sehr ausführlich und übersichtlich.
Ich habe es am Wochenende nochmal ausprobiert. Ich wollte ein simples Widget erstellen.
Leider mußte ich feststellen, dass das Qt-Release 5.10.1 nicht mehr im aktuellen Qt-Creator verfügbar ist. Ich habe daher Qt 5.12.3 genommen.
Da bekomme ich beim Ausführen des Programmes folgende Fehlermeldungen:
qt.qpa.plugin: Could not find the Qt platform plugin „eglfs“ in „“
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: linuxfb, minimal, offscreen, vnc, webgl, xcb.
ich habe diese Konfiguration:
Ubuntu: Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
Raspberry : PRETTY_NAME=“Raspbian GNU/Linux 9 (stretch)“
NAME=“Raspbian GNU/Linux“
VERSION_ID=“9″
VERSION=“9 (stretch)“
ID=raspbian
ID_LIKE=debian
Linux RPI3 4.19.75-v7+ #1271 SMP Mon Sep 30 13:49:02 BST 2019 armv7l GNU/Linux
Woran mag das wohl liegen?
Log-Files und Scripts mit den Installationsschritten kann ich gerne zur Verfügung stellen.
Vielen Dank für eine Antwort im Voraus.
Kurt
Hallo Kurt,
schau mal ob das hier hilft:
https://forum.qt.io/topic/93247/qt-qpa-plugin-could-not-load-the-qt-platform-plugin-xcb-in-even-though-it-was-found
Ist zwar nur ein „ähnliches“ Problem, aber ggf. reicht das ja. Soweit ich deine Frage verstanden habe, geht es um die Entwicklungsumgebung auf dem Host, die den Fehler meldet oder?
Gruß
Daniel
Hallo Daniel,
vielen Dank für Deine Antwort.
Ich habe nochmal ein Script geschrieben in dem Ich alle Installationsschritte nochmals ausführe.
Das hat ausgezeichnet geklappt.
Jetzt habe ich aber ein Problem:
1. Ich erstelle ein ganz normales widget mit 2 Buttons.
2. Diese aktiviere ich in mainwindow.ui
—> Linksklick auf Element |—> Slot anzeigen |—> QAbstrackButton |—> clicked()
3. Dann gebe ich in mainwindow.cpp and der Stelle z.B qDebug() >> „123“; ein.
4. Wenn ich jetzt das Programm ausführe, dann bekomme ich zwar das Widget am Display angezeigt aber das Programm reagiert nicht aufs anklicken.
Ich vermute, dass das LCD-Display nich richtig erkannt wird.
Es ist ein 3,5″ LCD mit HDMI Schnittstelle. Die Eingabe am Touchscreen wird aber über die I/O pins verarbeitet:
Interface
PIN NO. SYMBOL DESCRIPTION
1, 17 3.3V Power positive (3.3V power input)
2, 4 5V Power positive (5V power input)
3, 5, 7, 8, 10, 11, 12, 13, 15, 16, 18, 24 NC NC
6, 9, 14, 20, 25 GND Ground
19 TP_SI SPI data input of Touch Panel
21 TP_SO SPI data output of Touch Panel
22 TP_IRQ Touch Panel interrupt, low level while the Touch Panel detects touching
23 TP_SCK SPI clock of Touch Panel
26 TP_CS Touch Panel chip selection, low active
was muß ich da wohl einstellen damit der Touchscreen auch funktioniert?
Wäre schön wenn da einer eine Tipp hätte.
Hallo,
ich habe gerade noch gesehen, dass im Ausgabe der Anwendung diese Meldung steht:
Unable to query physical screen size, defaulting to 100 dpi.
To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).
Hallo Daniel!
Die Installation hat so geklappt und es hat auch keine Komplikationen gegeben.
Jetzt bin ich am Ende des Tutorials angekommen und bekomme den ersten Fehler:
Wenn ich auf den grünen Pfeil klicke, dann sehe ich im Application Output Fenster die Meldung „Could not initialize egl display“…
Googlen hat bis jetzt leider nicht wirklich geholfen, vielleicht kannst du da ja zufällig weiterhelfen
Danke und LG,
Flo
Hallo Flo,
hast du auf dem Raspberry einen Displayserver gestartet, sprich bist du auf dem Desktop und hast einen Monitor angeschlossen (es geht auch der Raspberry Pi Monitor)?
Gruß
Daniel
Hallo Daniel,
ich habe VNC auf dem Raspberry laufen. Allerdings hab ich es auch mit einem normalem HDMI-Display versucht und das gleiche Resultat erhalten. Ich werde jetzt aber ein paar Versuche in dieser Richtung starten.
Danke und LG,
Flo
Update:
Ob normales Display, VNC oder beides aktiv ist, ändert leider nichts.
Ich habe Qt Creator auch auf dem Raspberry installiert und da kann ich Anwendungen ausführen.
Wenn ich die ausführbare Datei von der Ubuntu VM auf den Raspberry kopiere und mit der Konsole ausführen will, dann bekomme ich eine genauere Fehlermeldung:
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to ‚/tmp/runtime-root‘
libEGL warning: DRI2: failed to authenticate
Unable to query physical screen size, defaulting to 100 dpi.
To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).
EGL Error : Could not create the egl surface: error = 0x300b
Damit werde ich vermutlich mehr anfangen können
Noch ein Update (hihi):
Wenn ich die Datei mit Doppelklick am Raspberry ausführe, dann funktioniert es….
Hallo Flo,
ich habe mal etwas bei Google rum gesucht und einen relativ aktuellen Beitrag im Qt-Forum gefunden:
https://forum.qt.io/topic/102841/qt-runtime-dependency
Es sieht aus, als das du ein Authentifizierungsproblem beim X11 hast. Ggf. musst du mal schauen welche Komponenten in deinem Programm „sudo“ benötigen (oder du rufst das Programm ggf. damit auf?) und die entsprechenden Rechte updaten.
Gruß
Daniel
Hallo Daniel,
danke für die Hilfe, das hat das Problem für mich sehr eingegrenzt.
Um mich jetzt nicht mit irgendwelchen Hardware-Berechtigungen rumschlagen zu müssen hab ich mir jetzt eine Alternativlösung gebastelt:
Wenn ich in der VM im Creator „Run“ drücke, bekomme ich die ausführbare Datei am RPi automatisch nach /opt/PROJEKTNAME/bin/PROJEKTNAME. Ich hab mir einfach einen Link zu dieser Datei auf dem Desktop gemacht und führe sie jedes Mal aus, wenn ich Änderungen vornehme. Ein Klick mehr, der mich nicht wirklich stört.
Danke nochmal und LG,
Flo
Hallo Flo,
das ist natürlich auch eine Möglichkeit das Problem zu lösen :)
Gruß
Daniel
Hallo Kampi,
super Tutorial, vielen Dank für Deine ganzen Mühen :-)
Ein Problem gibt es nur leider bei der Installation mit deinem Script auf dem Host:
Download /lib…
root@192.168.0.113’s password:
Permission denied, please try again.
bereits vor „Download toolchain“ gab es eine Passwortabfrage, bei der ich das Raspberry-Systempasswort eingegeben habe, da gab es keine Probleme.
Hast du vielleicht einen Tip?
Beste Grüße!
Fabian
Hallo Florian,
hast du den root Zugriff über SSH aktiviert?
https://raspberrypi.stackexchange.com/questions/48056/how-to-login-as-root-remotely
Ich habe das Skript gerade noch einmal ausprobiert und keine Probleme. Es scheint wohl eher an deinem SSH Zugang zu liegen.
Gruß
Daniel
Hallo Daniel,
ich habe Deine Scripts „PrepareHost.sh“ und „CompileQt_Host.sh“ (Stand 01.05.2020)
auf einer Oracle VM Virtual Box unter Windows 7 Ultimate in „Ubuntu 18.04 LTS“ laufen lassen.
Dabei habe ich versucht „qt-anywhere-src-5.14.2“ zu kompilieren.
Tolle Arbeit so weit ! Ein paar Problemchen hatte und habe ich dann noch…
In „PrepareHost.sh“ habe ich noch ganz am Anfang unter den „Colors“ folgendes eingefügt:
sudo apt-get update
sudo apt-get upgrade
Der Abschnitt „Install packages…“ hat Probleme gemacht:
libjasper-dev, libpng12-dev, gcc-c++, pyton3-devel sind nicht zu finden
libz-dev muss gegen zlib1g-dev getauscht werden
Brauche ich die, die nicht zu finden sind ?
In „CompileQt_Host.sh“ treten bei „Checking for valid makespec…“ Probleme auf.
> /home/ralf/Toolchain/RaspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: crt1.o kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
> /home/ralf/Toolchain/RaspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: crti.o kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
> /home/ralf/Toolchain/RaspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: -lm kann nicht gefunden werden
> collect2: Fehler: ld gab 1 als Ende-Status zurück
> Makefile:68: recipe for target ‚verifyspec‘ failed
> make: *** [verifyspec] Error 1
Note: Also available for Linux: linux-clang linux-icc
ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken.
Build Qt…
make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden. Schluss.
make: *** Keine Regel, um „install“ zu erstellen. Schluss.
An der Stelle komme ich auch mit Googles Ratschlägen nicht weiter,
kannst Du mir etwas dazu raten…?
Bleib gesund und Gruß
Ralf
Hallo Ralf,
anscheinend sind die fehlenden Pakete bei Ubuntu 18.04 nicht mehr drin. Da war ich wohl etwas zu optimistisch und habe den Ubuntu 18.04 Support nicht gecheckt :). Ich ändere es mal zurück auf 16.04, weil ich aktuell kein Ubuntu-System habe, sondern CentOS nutze.
Ggf. helfen dir diese Links weiter:
https://stackoverflow.com/questions/43484357/opencv-in-ubuntu-17-04/44488374#44488374
https://askubuntu.com/questions/991706/e-package-libpng12-dev-has-no-installation-candidate
https://linuxconfig.org/how-to-install-g-the-c-compiler-on-ubuntu-18-04-bionic-beaver-linux
Und „python-devel“ heißt „python-dev“.
Die Paketnamen haben aber nichts mit dem zweiten Problem zu tun, weil das wohl nur die Toolchain betrifft und die lädst du dir quasi fertig runter.
Hast du mal gecheckt ob der Pfad auf deinem System vorhanden ist? Nicht das du einfach nur einen Fehler im Pfadnamen hast.
Ansonsten check mal diesen Link:
https://forum.qt.io/topic/91457/qt-5-10-cross-compilation-raspberry-pi-issue-cannot-find-crt1-o-cannot-find-lm/3
Wie gesagt, ich vermute du hast irgendwo einen Fehler im Pfad drin (oder ich im Skript) und das verursacht den Fehler. Alternativ einfach mal die Toolchain runterschmeißen und neu downloaden.
Gruß
Daniel
Hallo Daniel,
vielen Dank für die schnelle Reaktion.
Ein paar Probleme konnte ich lösen.
Die vermissten „crti.o“ und „crt1.o“ Dateien habe ich kopiert:
/usr/arm-linux-gnueabihf/lib/crti.o –> Toolchain/RaspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbianx64/lib/gcc/arm-linux-gnueabihf/4.8.3
/usr/arm-linux-gnueabihf/lib/crt1.o –> Toolchain/RaspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbianx64/lib/gcc/arm-linux-gnueabihf/4.8.3
Die im „PrepareHost.sh“ nicht zu findenden Packages habe ich installiert mit:
sudo add-apt-repository ‚deb http://security.ubuntu.com/ubuntu xenial-security main‘;sudo apt update;sudo apt install libjasper1 libjasper-dev
sudo apt-get install python-dev
sudo apt-get install libpng-dev
Was ich immer noch nicht in den Griff bekomme ist:
> /home/ralf/Toolchain/RaspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: -lm kann nicht gefunden werden
> collect2: Fehler: ld gab 1 als Ende-Status zurück
> Makefile:68: recipe for target ‚verifyspec‘ failed
> make: *** [verifyspec] Error 1
Note: Also available for Linux: linux-clang linux-icc
ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken.
Build Qt…
make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden. Schluss.
make: *** Keine Regel, um „install“ zu erstellen. Schluss.
Hast Du dazu noch eine Idee…?!?
Bleib gesund und Danke
Ralf
Hallo Ralf,
den Linker kannst du auch kopieren :)
Gruß
Daniel
Hallo Daniel,
bei der Suche nach Informationen zu Qt und Raspberry Pi habe ich gerade diese Anleitung entdeckt. Ich möchte mit Qt eine Anwendung entwickeln, die auf dem Raspberry Pi laufen soll.
Lässt sich auch Qt unter Windows so konfigurieren, dass man Anwendungen für den Raspberry Pi erstellen kann oder muss das Host-System ein Linux-System sein? Mir wäre es lieb, wenn ich alles auf meinem Windows-System entwickeln könnte, denn das würde mir manche Dinge vereinfachen.
Herzliche Grüße,
Ralf
Hallo Ralf,
prinzipiell benötigst du dafür die Kernelsourcen vom Raspberry Pi und du brauchst einen Cross-Compiler für den Raspberry Pi der unter Windows läuft. Ich selber habe das bisher nicht von Hand lauffähig gemacht, aber es das hier (leider kostenpflichtig), womit du Code in Visual Studio für den Raspberry Pi entwickeln kannst und die bieten auch eine Anleitung für Qt. Die Anleitung ist aber dezent alt und als ich es das letzte mal verwendet habe, gab es ein paar Probleme, die ich damals nicht lösen konnte.
https://www.kampis-elektroecke.de/2018/03/visualgdb-zum-entwickeln-von-anwendungen-fuer-den-raspberry-pi-unter-windows/
https://visualgdb.com/tutorials/raspberry/qt/
Ansonsten kann man (und das ist eines meiner ToDos) auch das WSL verwenden. Das hat wohl mittlerweile auch eine GUI, sprich du kannst das Linux direkt im Windows verwenden und direkt auf deine Dateien im Windows zugreifen. Hab damit vor dem letzten Patch schon im Windows unter Linux einen Linuxkernel kompilieren können. Mit GUI sollte (theoretisch) auch Qt laufen. Aber wie gesagt, das will ich selber noch einmal testen…
Ansonsten fallen mir leider nicht mehr Möglichkeiten ein. Windows ist leider etwas zurückgeblieben, was die Entwicklungstools für Linux angeht :(
Gruß
Daniel
Hallo Daniel,
schade, das wird dann wohl doch etwas komplizierter. Ich habe das WSL noch nicht ausprobiert, da ich bereits seit einigen Jahren VMware Workstation verwende und das genau das tut, was es soll.
Linux an sich ist nicht das Problem, aber mit jeder neuen Version einer Distribution ändern sich Pakete und man muss wieder irgendwo „Hand anlegen“, damit die Installation gelingt, wie auch die Posts hier zeigen. All das kostet Zeit, die mir für andere Dinge fehlt.
Grüße,
Ralf
Hallo Daniel,
ich versuche seit gestern wie beschrieben eine Linux-VM zur Entwicklung von Raspberry-Pi-Anwendungen mit Qt aufzusetzen.
Mit viel Mühe ist es mir gelungen, unter LinuxMint 19.3 (Ubuntu 18.04) alles zu installieren und zu kompilieren (allerdings mit gdb 9.2). Als device habe ich „linux-rasp-pi3-vc4-g++“ verwendet. Das war aber wohl falsch, denn beim Deployment auf meinem Raspi 4 kommt eine diesbezügliche Fehlermeldung (ich habe erst heute gelesen, dass Raspbian als Defaulttreiber v3d verwendet). Jetzt habe ich Qt mit „linux-rasp-pi3-g++“ neu kompilieren wollen, was aber nicht funktioniert. „make install“ bricht mit folgender Fehlermeldung ab:
—-
In file included from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtwayland/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.cpp:55:0:
/opt/RaspberryQt/sysroot/opt/vc/include/GLES2/gl2.h:600:125: Fehler: declaration of C function »void glShaderSource(GLuint, GLsizei, const GLchar**, const GLint*)« conflicts with
GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar** string, const GLint* length);
^
In file included from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtbase/include/QtGui/../../src/gui/opengl/qopengl.h:105:0,
from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtbase/include/QtGui/qopengl.h:1,
from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtwayland/include/QtWaylandCompositor/../../src/compositor/compositor_api/qwaylandbufferref.h:47,
from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtwayland/include/QtWaylandCompositor/qwaylandbufferref.h:1,
from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtwayland/include/QtWaylandCompositor/5.12.8/QtWaylandCompositor/private/../../../../../src/compositor/hardware_integration/qwlclientbufferintegration_p.h:56,
from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtwayland/include/QtWaylandCompositor/5.12.8/QtWaylandCompositor/private/qwlclientbufferintegration_p.h:1,
from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtwayland/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.h:43,
from /opt/RaspberryQt/qt-everywhere-src-5.12.8/qtwayland/src/hardwareintegration/compositor/brcm-egl/brcmeglintegration.cpp:40:
/opt/RaspberryQt/sysroot/usr/include/GLES3/gl32.h:626:29: Fehler: previous declaration »void glShaderSource(GLuint, GLsizei, const GLchar* const*, const GLint*)« here
GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
^
Makefile:1838: recipe for target ‚.obj/brcmeglintegration.o‘ failed
—-
Ich habe alles „von Hand“ gemacht, nicht mit dem Skript.
Hast Du eine Idee, was da los ist? Muss ich evtl. beim Aufruf einen Parameter ändern?
Grüße,
Ralf
Hallo Ralf,
nein, ich weiß leider nicht wo das Problem liegt und wie man es beheben kann. Aber du kannst ein Ticket bei Git eröffnen. Die Spezialisten dort wissen bestimmt wo das Problem liegt.
Gruß
Daniel