J'ai écrit sur l'installation de Raspbian sur Raspberry Compute Module et la configuration de la compilation croisée pour QtCreator sur Ubuntu 20.
Cet article est une mise à jour de la version 6.8 de Qt, raspi OS Bookworm et Ubuntu 22.04 LTS.
Conditions préalables
J'ai utilisé le matériel et les logiciels suivants :
Raspberry Pi 4
raspi OS Bookworm, sans logiciel recommandé
Ubuntu 22.04 LTS
Qt 6.8
QtCreator 14.02
Notes
Si vous disposez d'un ordinateur portable ou de bureau avec suffisamment de mémoire vive et de cœurs de processeur, vous pouvez effectuer la compilation croisée dans une machine virtuelle. Mais j'ai fait l'expérience qu'un ordinateur natif est beaucoup plus rapide et produit moins d'erreurs.
Jetez un coup d'œil aux chemins d'accès aux fichiers et aux adresses IP dans mes exemples de code et adaptez-les à vos besoins.
Découvrir les versions de gcc, ld et ldd. Le code source de la même version doit être téléchargé pour construire le compilateur croisé plus tard.
pi@raspberrypi:~ $ gcc --version
gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
pi@raspberrypi:~ $ ld --version
GNU ld (GNU Binutils for Debian) 2.40
Copyright (C) 2023 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
pi@raspberrypi:~ $ ldd --version
ldd (Debian GLIBC 2.36-9+rpt2+deb12u8) 2.36
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
Ajouter le morceau de code suivant à la fin de ~/.bashrc et mettre à jour les changements :
Construire la dernière version de cmake à partir des sources :
cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.30.5/cmake-3.30.5.tar.gz
tar -xzvf cmake-3.30.5.tar.gz
cd cmake-3.30.5
./bootstrap
make -j$(nproc)
sudo make install
# Update PATH Environment Variable
which cmake
/usr/local/bin/cmake
export PATH=/usr/local/bin/cmake:$PATH
source ~/.bashrc
cmake --version
Construire gcc en tant que compilateur croisé
Télécharger le code source nécessaire. Vous devez modifier les commandes suivantes en fonction de vos besoins. Au moment où je rédige cette page, elles sont les suivantes :
gcc 12.2.0
binutils 2.40 (version ld)
glibc 2.36(version ldd)
cd ~
mkdir gcc_all && cd gcc_all
wget https://ftpmirror.gnu.org/binutils/binutils-2.40.tar.bz2
wget https://ftpmirror.gnu.org/glibc/glibc-2.36.tar.bz2
wget https://ftpmirror.gnu.org/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz
git clone --depth=1 https://github.com/raspberrypi/linux
tar xf binutils-2.40.tar.bz2
tar xf glibc-2.36.tar.bz2
tar xf gcc-12.2.0.tar.gz
rm *.tar.*
cd gcc-12.2.0
contrib/download_prerequisites
Créer un dossier pour l'installation du compilateur.
Copier les en-têtes du noyau dans le dossier ci-dessus.
cd ~/gcc_all
cd linux
KERNEL=kernel7
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross-pi-gcc/aarch64-linux-gnu headers_install
Construire Binutils.
cd ~/gcc_all
mkdir build-binutils && cd build-binutils
../binutils-2.40/configure --prefix=/opt/cross-pi-gcc --target=aarch64-linux-gnu --with-arch=armv8 --disable-multilib
make -j 8
make install
Editer gcc-12.2.0/libsanitizer/asan/asan_linux.cpp. Ajouter le morceau de code suivant.
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
Faire une compilation partielle de gcc.
cd ~/gcc_all
mkdir build-gcc && cd build-gcc
../gcc-12.2.0/configure --prefix=/opt/cross-pi-gcc --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
make -j8 all-gcc
make install-gcc
Compilation partielle de la Glibc.
cd ~/gcc_all
mkdir build-glibc && cd build-glibc
../glibc-2.36/configure --prefix=/opt/cross-pi-gcc/aarch64-linux-gnu --build=$MACHTYPE --host=aarch64-linux-gnu --target=aarch64-linux-gnu --with-headers=/opt/cross-pi-gcc/aarch64-linux-gnu/include --disable-multilib libc_cv_forced_unwind=yes
make install-bootstrap-headers=yes install-headers
make -j8 csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross-pi-gcc/aarch64-linux-gnu/lib
aarch64-linux-gnu-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross-pi-gcc/aarch64-linux-gnu/lib/libc.so
touch /opt/cross-pi-gcc/aarch64-linux-gnu/include/gnu/stubs.h
Retour à gcc.
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
Finir la construction de la glibc.
cd ~/gcc_all/build-glibc
make -j8
make install
Finir la construction de gcc.
cd ~/gcc_all/build-gcc
make -j8
make install
A ce stade, nous avons une chaîne d'outils complète de compilateur croisé avec gcc. Le dossier gcc_all n'est plus nécessaire. Vous pouvez le supprimer.
Construire Qt6
Il y a deux possibilités pour construire Qt6. Il existe une version "single" (https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.tar.xz) à télécharger, qui contient qtbase et tous les sous-modules. Cette version est très lourde et nécessite beaucoup de puissance et de temps pour la compiler.
Je recommande de compiler qtbase comme base et de ne compiler ensuite que chaque sous-module dont vous avez besoin séparément.
Créer des dossiers pour sysroot et qt6. Je crée ces dossiers dans le répertoire workspace/qt-rpi-cross-compilation.
cd ~/workspace/qt-rpi-cross-compilation/qt6/src
wget https://download.qt.io/official_releases/qt/6.8/6.8.0/submodules/qtbase-everywhere-src-6.8.0.tar.xz
tar xf qtbase-everywhere-src-6.8.0.tar.xz
Créez un fichier nommé toolchain.cmake dans ~/workspace/qt-rpi-cross-compilation/qt6.
Vous devez ajuster la ligne "set(TARGET_SYSROOT /home/factory/workspace/qt-rpi-cross-compilation/rpi-sysroot)" à votre environnement.
Si vous créez un projet dans QtCreator, vous devez ajuster la configuration de "Run". Sur "Environment", vous devez ajouter :
-LD_LIBRARY_PATH=:/usr/local/qt6/lib/
Ajouter des sous-modules Qt
Ajouter le module QML
Télécharger les codes sources :
cd ~/workspace/qt-rpi-cross-compilation/qt6/src
wget https://download.qt.io/official_releases/qt/6.8/6.8.0/submodules/qtshadertools-everywhere-src-6.8.0.tar.xz
tar xf qtshadertools-everywhere-src-6.8.0.tar.xz
wget https://download.qt.io/official_releases/qt/6.8/6.8.0/submodules/qtdeclarative-everywhere-src-6.8.0.tar.xz
tar xf qtdeclarative-everywhere-src-6.8.0.tar.xz
Vous devez vérifier les dépendances à ~/workspace/qt-rpi-cross-compilation/qt6/src/qtdeclarative-everywhere-src-6.8.0/dependencies.yaml et ~/workspace/qt-rpi-cross-compilation/qt6/src/qtshadertools-everywhere-src-6.8.0/dependencies.yaml.
Assurez-vous que les modules requis soient construits et installés en premier.