Cross-compilation Qt 5.12.5 pour Raspberry Pi
Introduction
Pourquoi ce tutoriel ?
Ceci est une mise à jour du tutoriel pour la version 5.12.5 de Qt.
Le but de ce tutoriel est de mettre en place une chaine de cross-compilation entre un PC linux et un RaspberryPi 3. On va aussi configurer l’IDE QtCreator pour cette config.
J'ai essayé de faire fonctionner QtMultimedia mais cette partie de Qt ne fonctionne pas complètement sur Raspberry Pi. On peut lire du son mais pas de vidéo.
Pour compenser j'ai décidé d'inclure libvlc dans ce tuto.
Matériel nécessaire
Pour les besoins de ce tutoriel, je vais utiliser un machine virtuelle sous Debian 9. J’aurais juste configuré les additions invités avant le tuto. Cinnamon fonctionnant mal avec VirtualBox, je conseille d’utiliser un autre DE. Ici j’ai choisi Gnome.
Ma configuration est la suivante :
- PC sous debian 9
- VM Virtual Box sous debian 9
- Raspberry Pi 3 avec Raspbian stretch version complète
- Le RaspberryPi est en 192.168.1.2
Quelques points importants :
- Testé avec carte SD de 16Go, non testé avec une carte 8Go, mais devrait fonctionner.
- Il est tout à fait possible de tout faire sur le PC host. La Vm est là uniquement pour le tuto mais je conseille de faire un essai sur une VM avant car on peut vite faire des erreurs.
Je passe l’installation de Raspbian sur la Pi, c’est tout à fait classique. Il est tout de même important de prendre une version complète car le but est de faire des fenêtres graphiques.
Installation de la chaîne de cross-compilation
Configuration Raspberry Pi
On va maintenant configurer le Raspberry Pi et installer les paquets dont on aura besoin plus tard. Il faut effectuer toutes ces commandes en sudo ou en root sur le Raspberry Pi.
1. On commence éditer le fichier /etc/apt/sources.list pour décommenter la dernière ligne qui doit ressembler à ceci :
deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
On peut éditer avec :
nano /etc/apt/sources.list
2. On effectue les mises à jour puis on reboot :
sudo apt update sudo apt upgrade reboot
3. On fait une mise à jour du firmware puis on reboot à nouveau :
rpi-update reboot
4. Il faut bien vérifier que le firmware est à jour en relançant rpi-update jusqu’à ce que ce message s’affiche : Your firmware is already up to date
5. On va maintenant autoriser le login du compte root en ssh. Pour cela il faut éditer le fichier « /etc/ssh/sshd_config » , trouver la ligne « PermitRootLogin » la décommenter et passer son paramètre à « yes ».
sudo nano /etc/ssh/sshd_config
6. Il faut également donner un mot de passe au compte root pour pouvoir se connecter en ssh :
sudo su passwd
7. On peut maintenant se connecter en tant que root en ssh depuis le PC. On le fait.
ssh pi@192.168.1.2
8. On installe ces paquets :
sudo apt update sudo apt build-dep qt4-x11 sudo apt build-dep qtbase-opensource-src sudo apt install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver sudo apt install libegl1-mesa libegl1-mesa-dev libgles2-mesa libgles2-mesa-dev sudo apt install wiringpi libnfc-bin libnfc-dev fonts-texgyre libts-dev sudo apt install libbluetooth-dev bluez-tools gstreamer1.0-plugins* libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libopenal-data libopenal1 libopenal-dev pulseaudio sudo apt install -y libgstreamer*-dev sudo apt install -y gstreamer*-dev sudo apt install -y libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev gstreamer-tools libgstreamer-plugins-* sudo apt install qtdeclarative5-dev sudo apt install libvlc-dev
9. On va créer un répertoire pour Qt dans /usr/local :
sudo mkdir /usr/local/qt5pi sudo chown pi:pi /usr/local/qt5pi
On a terminé avec le Raspberry Pi
Configuration de Debian
1. Mises à jour :
sudo apt update sudo apt upgrade
2. Installations de dépendances :
sudo apt install gcc git bison python gperf pkg-config
3. Création du répertoire d’installation. Contrairement au tuto précédent, on va installer Qt dans le répertoire personnel :
mkdir ~/raspi cd ~/raspi
4. Téléchargement des outils de cross-compilation :
git clone https://github.com/raspberrypi/tools
5. Ajout du PATH dans les variables d’environnement. On va pour cela éditer le fichier « ~/.bashrc » avec nano par exemple :
export PATH=$PATH:~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
6. Reboot :
reboot
7. Une fois redémarré:
cd ~/raspi
8. Création du sysroot et synchronisation. Il faut remplacer l’IP par celle de la RaspberryPi chez vous :
mkdir sysroot sysroot/usr sysroot/opt rsync -avz root@192.168.1.2:/lib sysroot rsync -avz root@192.168.1.2:/usr/include sysroot/usr rsync -avz root@192.168.1.2:/usr/lib sysroot/usr rsync -avz root@192.168.1.2:/opt/vc sysroot/opt
9. Téléchargement et extraction de Qt 5.12.5 :
wget http://download.qt.io/official_releases/qt/5.12/5.12.5/single/qt-everywhere-src-5.12.5.tar.xz tar xvf qt-everywhere-src-5.12.5.tar.xz
10. téléchargement du script et fix des liens symboliques :
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py chmod +x sysroot-relativelinks.py ./sysroot-relativelinks.py sysroot
11. On lance le .configure dans le dossier de build. Il faut remplacer [RPI-VERSION] par ce le contenu du la liste ci dessous en fonction de la version de votre raspberry pi.
- Raspberry Pi 0/1:
- Raspberry Pi 2:
- Raspberry Pi 3: linux-rasp-pi-g++
cd qt-everywhere-src-5.12.5/ ./configure -release -opengl es2 -device [RPI-VERSION] -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 -skip qtwayland -skip qtlocation -skip qtscript -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -no-use-gold-linker -v -no-gbm
12. On compile et installe. La compilation peut prendre plusieurs heures. Si la machine a plusieurs processeurs de configurés, l'option -j permet d'accélérer la compilation, par exemple avec 4 processeur on peut faire "make -j4" à la place de "make" :
make make install
13. On déploie Qt sur le RPi :
cd .. rsync -avz qt5pi pi@192.168.1.2:/usr/local
retour sur le Raspberry Pi
1. On se connecte en ssh au Raspbery:
ssh pi@192.168.1.2
2. Fix de qt5pi.conf:
echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf sudo ldconfig
Test
Qt est maintenant installé! On retourne sur le PC.
1. Pour tester que tout fonctionne correctement, on peut créer deux fichier qu’on va compiler. On va créer deux document, un .cpp et un .pro :
Création du .cpp :
//main.cpp
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"Hello World"<<endl;
return a.exec();
}
2. Création du fichier test.pro, on copie colle ce qui suit dans le fichier :
//test.pro
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp
3. On créer le makefile avec qmake puis on compile avec make :
~/raspi/qt5/bin/qmake make
4. On transfert le fichier exécutable sur la pi. On peut utiliser cette scp :
scp test root@192.168.1.2:/home/pi/Documents
5. On se connecte en ssh et on lance le programme :
./test
6. Il doit nous afficher ceci :
Hello World
Configuration de l’IDE
Dans cette partie, je vais essayer de décrire au mieux la configuration de QtCreator.
Comme des images valent mieux qu'un long discours :
Explications à venir
Sources
- https://www.youtube.com/watch?v=eCdPfnR8iI0
- http://ulasdikme.com/projects/raspberry/Qt_for_raspberrypi.php
- http://wapel.de/?p=641&fbclid=IwAR1MjlKlXg92mHDQQuPD2pJafG3M5iKuj0L84wi2xEAZ6uI2GMkqnLlieUM
- https://mechatronicsblog.com/cross-compile-and-deploy-qt-5-12-for-raspberry-pi/
- https://wiki.qt.io/Raspberry_Pi_Beginners_Guide