Ich habe über die Installation von Raspbian auf dem Raspberry Compute Module geschrieben und die Cross-Kompilierung für QtCreator unter Ubuntu 20 eingerichtet.
Dieser Blogpost ist ein Update auf die - zu diesem Zeitpunkt - neueste Version 6.8 von Qt, raspi OS Bookworm und Ubuntu 22.04 LTS.
Voraussetzungen
Ich habe die folgende Hard- und Software verwendet:
Raspberry Pi 4
raspi OS Bookworm, ohne empfohlene Software
Ubuntu 22.04 LTS
Qt 6.8
QtCreator 14.02
Anmerkungen
Wenn Sie einen Laptop oder Desktop-Computer mit genügend RAM und CPU-Kernen haben, können Sie die Cross-Compilation in einer virtuellen Maschine durchführen. Ich habe jedoch die Erfahrung gemacht, dass ein nativer Computer viel schneller ist und weniger Fehler produziert.
Schauen Sie sich die Dateipfade und IP-Adressen in meinen Codebeispielen an und passen Sie sie an Ihre Bedürfnisse an.
Erstellen Sie einen Ordner für die Installation von Qt 6:
sudo mkdir /usr/local/qt6
Ermitteln Sie die Versionen von gcc, ld und ldd. Der Quellcode der gleichen Version sollte heruntergeladen werden, um später einen Cross-Compiler zu erstellen.
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.
Fügen Sie den folgenden Code an das Ende von ~/.bashrc an und aktualisieren Sie die Änderungen:
Erstellen Sie die neueste cmake-Version aus den Quellen:
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
Bauen Sie gcc als Cross-Compiler
Laden Sie den erforderlichen Quellcode herunter. Sie sollten die folgenden Befehle an Ihre Bedürfnisse anpassen. Für die Zeit, in der ich diese Seite erstelle, sind sie das:
gcc 12.2.0
binutils 2.40(ld-Version)
glibc 2.36(ldd-Version)
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
Erstellen Sie einen Ordner für die Installation des Compilers.
Kopieren Sie die Kernel-Header in den obigen Ordner.
cd ~/gcc_all
cd linux
KERNEL=kernel7
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross-pi-gcc/aarch64-linux-gnu headers_install
Binutils erstellen.
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
Bearbeiten Sie gcc-12.2.0/libsanitizer/asan/asan_linux.cpp. Fügen Sie das folgende Stück Code hinzu.
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
Führen Sie einen partiellen Build von gcc durch.
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
Teilweise Erstellung von 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
Zurück zu gcc.
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
Fertigstellung der Glibc.
cd ~/gcc_all/build-glibc
make -j8
make install
Fertigstellung von gcc.
cd ~/gcc_all/build-gcc
make -j8
make install
An diesem Punkt haben wir eine vollständige Cross-Compiler-Toolchain mit gcc. Der Ordner gcc_all wird nicht mehr benötigt. Sie können ihn löschen.
Qt6 bauen
Es gibt zwei Möglichkeiten, Qt6 zu bauen. Es gibt eine "single" (https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.tar.xz) Version zum Herunterladen, die qtbase und alle Untermodule enthält. Diese Version ist sehr schwer und benötigt viel Energie und Zeit, um sie zu kompilieren.
Meine Empfehlung ist, qtbase als Basis zu kompilieren und danach nur jedes Submodul, das Sie benötigen, separat zu kompilieren.
Erstellen Sie Ordner für sysroot und qt6. Ich erstelle diese Ordner in meinem workspace/qt-rpi-cross-compilation Verzeichnis.
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
Erstellen Sie eine Datei namens toolchain.cmake in ~/workspace/qt-rpi-cross-compilation/qt6.
Sie müssen die Zeile "set(TARGET_SYSROOT /home/factory/workspace/qt-rpi-cross-compilation/rpi-sysroot)" an Ihre Umgebung anpassen.
Wenn Sie ein Projekt in QtCreator erstellen, müssen Sie die "Run" Konfiguration anpassen. Unter "Environment" müssen Sie hinzufügen:
-LD_LIBRARY_PATH=:/usr/local/qt6/lib/
Qt-Submodule hinzufügen
QML-Modul hinzufügen
Quellcodes herunterladen:
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
Sie müssen die Abhängigkeiten unter ~/workspace/qt-rpi-cross-compilation/qt6/src/qtdeclarative-everywhere-src-6.8.0/dependencies.yaml und ~/workspace/qt-rpi-cross-compilation/qt6/src/qtshadertools-everywhere-src-6.8.0/dependencies.yaml überprüfen.
Stellen Sie sicher, dass die benötigten Module zuerst gebaut und installiert werden.