Am scris despre instalarea Raspbian pe Raspberry Compute Module și configurarea compilării încrucișate pentru QtCreator pe Ubuntu 20.
Acest blogpost este o actualizare la - în acest moment - cea mai nouă versiune 6.8 a Qt, raspi OS Bookworm și Ubuntu 22.04 LTS.
Condiții prealabile
Am folosit următoarele hard- și software:
Raspberry Pi 4
raspi OS Bookworm, fără software-ul recomandat
Ubuntu 22.04 LTS
Qt 6.8
QtCreator 14.02
Note
Dacă aveți un laptop sau un computer desktop cu suficientă memorie RAM și nuclee CPU, puteți face compilarea încrucișată într-o mașină virtuală. Dar am făcut experiența, că un computer nativ este mult mai rapid și produce mai puține erori.
Aruncați o privire la căile fișierelor și adresele IP din exemplele mele de cod și adaptați-le la nevoile dvs.
Descoperiți versiunile de gcc, ld și ldd. Codul sursă al aceleiași versiuni trebuie descărcat pentru a construi ulterior compilatorul încrucișat.
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.
Adăugați următoarea bucată de cod la sfârșitul fișierului ~/.bashrc și actualizați modificările:
Construiți cea mai recentă versiune cmake din sursă:
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
Construiți gcc ca un compilator încrucișat
Descărcați codul sursă necesar. Ar trebui să modificați următoarele comenzi pentru nevoile dvs. Pentru momentul în care am făcut această pagină, acestea sunt:
gcc 12.2.0
binutils 2.40(versiunea ld)
glibc 2.36(versiunea 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
Copiați anteturile kernelului în folderul de mai sus.
cd ~/gcc_all
cd linux
KERNEL=kernel7
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross-pi-gcc/aarch64-linux-gnu headers_install
Construiți 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
Editați gcc-12.2.0/libsanitizer/asan/asan_linux.cpp. Adăugați următoarea bucată de cod.
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
Faceți o compilare parțială a 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
Compilați parțial 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
Înapoi la gcc.
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
Finalizați construirea glibc.
cd ~/gcc_all/build-glibc
make -j8
make install
Terminați compilarea gcc.
cd ~/gcc_all/build-gcc
make -j8
make install
În acest moment, avem un lanț complet de instrumente de compilare încrucișată cu gcc. Dosarul gcc_all nu mai este necesar. Îl puteți șterge.
Construirea Qt6
Există două posibilități de a construi Qt6. Există o versiune "single" (https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.tar.xz) pentru descărcare, care conține qtbase și toate submodulele. Acest lucru este foarte greu și necesită multă putere și timp pentru a-l compila.
Recomandarea mea este să compilați qtbase ca bază și apoi să compilați fiecare submodule de care aveți nevoie separat.
Creați foldere pentru sysroot și qt6. Am creat aceste foldere în directorul spațiului meu de lucru/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
Creați un fișier numit toolchain.cmake în ~/workspace/qt-rpi-cross-compilation/qt6.
Trebuie să ajustați linia "set(TARGET_SYSROOT /home/factory/workspace/qt-rpi-cross-compilation/rpi-sysroot)" la mediul dvs.
Dacă creați un proiect în QtCreator, trebuie să ajustați configurația "Run". La "Environment" trebuie să adăugați:
-LD_LIBRARY_PATH=:/usr/local/qt6/lib/
Adăugați submodule Qt
Adăugați modulul QML
Descărcați codurile sursă:
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
Trebuie să verificați dependențele la ~/workspace/qt-rpi-cross-compilation/qt6/src/qtdeclarative-everywhere-src-6.8.0/dependencies.yaml și ~/workspace/qt-rpi-cross-compilation/qt6/src/qtshadertools-everywhere-src-6.8.0/dependencies.yaml.
Asigurați-vă că modulele necesare trebuie să fie construite și instalate mai întâi.