table des matières
  1. Installer la chaîne de compilation croisée sur Debian 12
    1. Install sur Rasberry (cible)
    2. install sur PC Linux (poste de développement)
      1. Télécharger les ressources Qt
      2. Rsync des bibliothèques Raspberry
      3. Compilation de Qt
        1. Configuration de la fabrication :
        2. Fabrication
      4. Installer les fichiers compilés sur le Raspberry
  2. Configurer Qt Creator pour la compilation croisée
    1. Créer un Périphérique
    2. Ajouter les Compilateurs gcc et g++ pour raspberry
    3. Ajouter le débogueur gdb-multiarch
      1. Options de déboguage
    4. Créer une version Qt
    5. Créer un kit pour la cross compilation Raspberry
    6. Configuration du Raspberry pour le déploiement distant
  3. Créer un projet dans Qtcreator
  4. Créer une application graphique native
    1. Configuration du Raspberry
    2. Configuration de l’écran dans l’application

Installer la chaîne de compilation croisée sur Debian 12

  • source : https://www.interelectronix.com/fr/qt-515-compilation-croisee-pour-raspberry-compute-module-4-sur-ubuntu-20-lts.html

Contexte testé :

  • QtCreator 12 licence commerciale (académique)
  • 31/01/2024 : RPi2B avec raspbian bookworm lite (debian 12)
  • 07/02/2024 : RPi3B avec raspbian bookworm lite (debian 12)

Install sur Rasberry (cible)

  • intaller et configurer raspbian-lite (version console allégée de raspbian). Dernière mouture en 01/2024 : bookworm (Debian 12)
    • boot console
    • service ssh actif
    • display GL/Fake KMS (choix non dispo sur RPi2)
  • Ajouter les sources dans les paquetages .deb : éditer le fichier /etc/apt/sources.list et décommenter la ligne suivante :
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
  • mettre à jour
sudo apt-get update
sudo apt-get upgrade
  • installer les paquets nécessaires pour Qt5 et le débogage distant
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

Noter la VERSION de Qt installée, et utiliser le même N° pour le reste des installations.

Ici, j’ai installé la 5.15.8. Le cas échéant modifier les commandes subséquentes avec le N° de version approprié.

  • Créer ensuite un répertoire pour les librairies Qt qui seront utilisées par les applis développées ultérieurement
sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15

install sur PC Linux (poste de développement)

  • Installer les paquet requis pour le développement sous Qt
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc git bison gperf pkg-config gdb-multiarch
sudo apt-get install python-is-python3
sudo apt install build-essential
  • Installer Qt Creator version commerciale/education (https://www.qt.io/qt-educational-license )
  • on prépare une arborescence pour l’installation de la chaîne de cross compilation dans l’environnement de travail
mkdir ~/raspi
cd ~/raspi
mkdir build
mkdir tools
mkdir sysroot
mkdir sysroot/usr
mkdir sysroot/opt

Télécharger les ressources Qt

  • qt-everywhere est un paquetage qui permet le ciblage de Qt sur différentes plateformes, dont les différentes versions de Raspberry
wget https://download.qt.io/archive/qt/5.15/5.15.8/single/qt-everywhere-opensource-src-5.15.8.tar.xz
tar xvf qt-everywhere-opensource-src-5.15.8.tar.xz
  • Modif de qmake.conf (qmake.conf doit être modifié pour désigner le bon cross-compilateur)
cp -R qt-everywhere-src-5.15.8/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.15.8/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.15.8/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf
  • Télécharger le cross-compilateur et outils associés
cd  tools
wget https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabihf/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz
tar xfv gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz

Rsync des bibliothèques Raspberry

  • on effectue une copie locale des bibliothèques installées sur le raspberry.
  • L’@ du RPi utilisé ici est 192.168.17.34. Adapter selon le contexte.
cd ~/raspi
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.17.34:/lib sysroot/
rsync -av --rsync-path="sudo rsync" --delete pi@192.168.17.34:/usr/include sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.17.34:/usr/lib sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.17.34:/opt/vc sysroot/opt/
  • Télécharger et exécuter le script de création des liens relatifs
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

Compilation de Qt

Configuration de la fabrication :
  • Pour info, la liste des cibles disponibles peut être obtenue ainsi :
ls qt-everywhere-src-5.15.8/qtbase/mkspecs/devices/
  • la commande configure permet de préparer le makefile pour la fabrication de Qt.
  • l’option -device doit être adaptée selon le modèle de raspberry utilisé.
    • Exemple de configuration pour cible Raspberry Pi 2 :
cd build
../qt-everywhere-src-5.15.8/configure -release -opengl es2  -eglfs -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=~/raspi/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -prefix /usr/local/qt5.15 -extprefix ~/raspi/qt5.15 -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck
Fabrication
make -j4

(c’est long - on a le temps de prendre un café, voire plusieurs !) Si pas d’erreur, on continue ainsi :

make install
  • Maintenant, Qt est compilé et installé dans le répertoire local ~/raspi/qt5.15 , et configuré pour le répertoire distant sur le raspberry /usr/local/qt5.15

Installer les fichiers compilés sur le Raspberry

cd ~/raspi
rsync -avz --rsync-path="sudo rsync" qt5.15 pi@192.168.17.34:/usr/local/

Configurer Qt Creator pour la compilation croisée

  • source https://www.interelectronix.com/fr/qt-515-compilation-croisee-pour-raspberry-compute-module-4-sur-ubuntu-20-lts.html

Créer un Périphérique

  • Créer un périphérique de type Linux Distant

image-20240201091257399

image-20240201091701202

Ajouter les Compilateurs gcc et g++ pour raspberry

  • spécifier les chemins des exécutables dans les outils de cross-compil téléchargés (~/raspi/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/)

image-20240201092527355

Ajouter le débogueur gdb-multiarch

/usr/bin/gdb-multiarch

Options de déboguage

Par défaut, le débogueur n’a pas accès aux symboles des librairies Qt. Il faut lui indiquer explicitement le chemin.

  • ajouter la commande attachée set solib-search-path ~/raspi/qt5.15/lib

image-20240201110935044

Créer une version Qt

  • indiquer le chemin de la commande qmake dans le Qt installé pour la cross compil

image-20240201092746509

Créer un kit pour la cross compilation Raspberry

Paramètres à affecter :

  • Type de périphérique : Linux distant
  • Périphérique sur lequel exécuter : (Raspberry Pi précédemment créé)
  • Compiler le périphérique : Local PC (-> indique que les sources sont sur le PC local)
  • Racine du système : le dossier sysroot utilisé
  • Version de Qt : le Qt installé pour la cross compil
  • Débogueur : gdb-multiarch

image-20240201110150732

Configuration du Raspberry pour le déploiement distant

Par défaut qtcreator déploie les applications dans le dossier /opt sur le raspberry.

Comme le déploiement s’effectue sous l’identité ‘pi’, il faut que l’utilisateur ‘pi’ ait les droits de créer des fichiers dans le dossier /opt/ (sinon, cela crée une erreur lorsque qrcreator tente de déployer l’exécutable sur le raspberry)

pi@raspberrypi:~ $ sudo chown pi /opt/

Créer un projet dans Qtcreator

  • Créer une application Qt avec le Modèle Périphérique Linux Distant

image-20240201143949025

  • Sélectionner le Kit Raspberry Pi Qt

image-20240201144247881

Créer une application graphique native

Qt permet de créer des applications graphiques qui interfacent directement la carte graphique grâce au mode d’affichage EGLFS.

Cela permet d’éviter toutes les surcouches de XWindows, gestionnaire de fenêtres et autres environnements de bureau. C’est adapté à la réalisation de véritables applications embarquées.

Le version de Qt que nous avons compilée utilise EGLFS par défaut.

Configuration du Raspberry

  • si nécessaire reconfigurer avec raspi-config pour démarrer le RPi en mode console
  • Installer OPENGL
sudo apt install mesa-utils

Configuration de l’écran dans l’application

  • Ajouter (et adapter éventuellement) les lignes suivantes en début de main() :
qputenv("QT_QPA_EGLFS_INTEGRATION", "eglfs_kms");
qputenv("QT_QPA_EGLFS_WIDTH", "1024");
qputenv("QT_QPA_EGLFS_HEIGHT", "600");