Ik schreef over de installatie van Raspbian op Raspberry Compute Module en het instellen van cross compilatie voor QtCreator op Ubuntu 20.
Deze blogpost is een update naar de - op dit moment - nieuwste versie 6.8 van Qt, raspi OS Bookworm en Ubuntu 22.04 LTS.
Vereisten
Ik heb de volgende hard- en software gebruikt:
Raspberry Pi 4
raspi OS Bookworm, zonder aanbevolen software
Ubuntu 22.04 LTS
Qt 6.8
QtCreator 14.02
Opmerkingen
Als je een laptop of desktop computer met voldoende RAM en CPU cores hebt, kun je de cross compilatie in een virtuele machine doen. Maar ik heb ervaren dat een native computer veel sneller is en minder fouten produceert.
Bekijk de bestandspaden en ip-adressen in mijn codevoorbeelden en pas ze aan aan je behoeften.
Ontdek versies van gcc, ld en ldd. De broncode van dezelfde versie moet worden gedownload om later de cross compiler te bouwen.
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.
Voeg het volgende stukje code toe aan het einde van ~/.bashrc en werk de wijzigingen bij:
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
Bouw gcc als een cross compiler
Download de benodigde broncode. Je moet de volgende commando's aanpassen aan je behoeften. Op het moment dat ik deze pagina maak, zijn dat ze:
gcc 12.2.0
binutils 2.40(ld versie)
glibc 2.36(ldd versie)
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
cd ~/gcc_all
cd linux
KERNEL=kernel7
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross-pi-gcc/aarch64-linux-gnu headers_install
Bouw 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
Bewerk gcc-12.2.0/libsanitizer/asan/asan_linux.cpp. Voeg het volgende stukje code toe.
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
Doe een gedeeltelijke build van 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
Bouw Glibc gedeeltelijk.
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
Terug naar gcc.
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
Bouw glibc af.
cd ~/gcc_all/build-glibc
make -j8
make install
Bouw gcc af.
cd ~/gcc_all/build-gcc
make -j8
make install
Op dit punt hebben we een volledige cross compiler toolchain met gcc. De map gcc_all is niet meer nodig. Je kunt het verwijderen.
Qt6 bouwen
Er zijn twee mogelijkheden om Qt6 te bouwen. Er is een "single" (https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.tar.xz) versie te downloaden, die qtbase en alle submodules bevat. Dit is erg zwaar spul en heeft veel kracht en tijd nodig om het te compileren.
Mijn aanbeveling is om qtbase als basis te compileren en daarna alleen elke submodule die je nodig hebt apart te compileren.
Maak mappen voor sysroot en qt6. Ik maak deze mappen in mijn workspace/qt-rpi-cross-compilation directory.
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
Maak een bestand met de naam toolchain.cmake in ~/workspace/qt-rpi-cross-compilation/qt6.
Je moet de regel "set(TARGET_SYSROOT /home/factory/workspace/qt-rpi-cross-compilation/rpi-sysroot)" aanpassen aan je omgeving.
Als je een project maakt in QtCreator, moet je de "Run" configuratie aanpassen. Op "Environment" moet je toevoegen:
-LD_LIBRARY_PATH=:/usr/local/qt6/lib/
Qt-modules toevoegen
QML-module toevoegen
Broncodes downloaden:
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
Je moet afhankelijkheden controleren op ~/workspace/qt-rpi-cross-compilation/qt6/src/qtdeclarative-everywhere-src-6.8.0/dependencies.yaml en ~/workspace/qt-rpi-cross-compilation/qt6/src/qtshadertools-everywhere-src-6.8.0/dependencies.yaml.
Zorg ervoor dat de vereiste modules eerst worden gebouwd en geïnstalleerd.