Cross-compilation Qt 5.12.5 pour Raspberry Pi

De Wiki LOGre
Aller à : navigation, rechercher

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