Cross-compilation Qt 5.10.1 pour Raspberry Pi

De Wiki LOGre
Aller à : navigation, rechercher

Introduction

Pourquoi ce tutoriel ?

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 vraiment eu du mal à trouver un tutoriel fiable et à jour pour effectuer cette installation. C’est assez long et pas évident à faire donc j’ai décidé de faire ce tuto pour m’en servir plus tard si j’oublie certaines choses. Et si ça peut servir à d’autres c’est plutôt une bonne chose.

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 version complète
  • Le RaspberryPi est en 192.168.1.43

Quelques points importants :

  • Une carte SD de 16Go minimum est préférable pour l'installation de Raspbian, Qt prenant beaucoup d'espace. Non testé à 8Go.
  • Il est tout à fait possible de tout faire sur le PC host. La Vm est là uniquement pour le tuto.

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
sudo apt dist-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. On le fait.

8. On installe ces paquets :

apt build-dep qt5-qmake 
apt build-dep libqt5webengine-data
apt install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver

9. On va crééer un répertoire pour Qt dans /usr/local :

mkdir /usr/local/qt5pi
chown -R root:root /usr/local/qt5pi

10. 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. On change le propriétaire du dossier par l’utilisateur qui va compiler. Sur certains systèmes il faut remplacer 1000 par le nom d’utilisateur et son groupe. On entre dans le répertoire :

sudo mkdir /opt/qt5pi
sudo chown 1000:1000 /opt/qt5pi
cd /opt/qt5pi

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:/opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

Reboot :

reboot

6. Téléchargement et extraction de Qt. On peut remplacer cette version par une version plus récente si l’on veut mais il faudra penser à le modifier par la suite également :

cd /opt/qt5pi
wget http://download.qt.io/official_releases/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz
tar xf qt-everywhere-src-5.10.1.tar.xz

7. Configuration, changement de certain noms de fichiers :

cp -R qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf

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.43:/lib sysroot
rsync -avz root@192.168.1.43:/usr/include sysroot/usr
rsync -avz root@192.168.1.43:/usr/lib sysroot/usr
rsync -avz root@192.168.1.43:/opt/vc sysroot/opt

9. création de liens symboliques et sauvegarde des vielles versions du fichier :

mv sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup
ln -s sysroot/opt/vc/lib/libEGL.so sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

mv sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup
ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

ln -s sysroot/opt/vc/lib/libEGL.so sysroot/opt/vc/lib/libEGL.so.1

ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/opt/vc/lib/libGLESv2.so.2

10. Téléchargement du script de modification des liens relatifs et exécution :

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

11. On relance la synchro, de nouveaux fichiers doivent se synchroniser puis on relance le script :

rsync -avz root@192.168.1.43:/lib sysroot
rsync -avz root@192.168.1.43:/usr/include sysroot/usr
rsync -avz root@192.168.1.43:/usr/lib sysroot/usr
rsync -avz root@192.168.1.43:/opt/vc sysroot/opt
./sysroot-relativelinks.py sysroot

12. On crée le répertoire de build et on entre dedans :

mkdir qt5build
cd qt5build

13. On lance le .configure dans le dossier de build :

../qt-everywhere-src-5.10.1/configure -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -sysroot /opt/qt5pi/sysroot -prefix /usr/local/qt5pi -opensource -confirm-license -skip qtscript -nomake examples -make libs -pkg-config -no-use-gold-linker -v 
14. On compile et installe
make -j4
make install

15. Dernière synchro et c’est fini :

cd ..
rsync -avz sysroot/usr/local/qt5pi root@192.168.1.43:/usr/local

16. 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();
}

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

17. On créer le makefile avec qmake puis on compile avec make :

/opt/qt5pi/sysroot/usr/local/qt5pi/bin/qmake 

make

18. On transfert le fichier exécutable sur la pi. On peut utiliser cette scp :

scp test root@192.168.1.43:/home/pi/Documents

22. On se connecte en ssh et on lance le programme :

./test

23. 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

Merci à lui !