Я писал об установке Raspbian на Raspberry Compute Module и настройке кросс-компиляции для QtCreator на Ubuntu 20.
Этот блогпост является обновлением до - на данный момент - самой новой версии 6.8 Qt, raspi OS Bookworm и Ubuntu 22.04 LTS.
Пререквизиты
Я использовал следующие харды и программы:
Raspberry Pi 4
raspi OS Bookworm, без рекомендуемого программного обеспечения
Ubuntu 22.04 LTS
Qt 6.8
QtCreator 14.02
Примечания
Если у вас есть ноутбук или настольный компьютер с достаточным количеством оперативной памяти и ядер процессора, вы можете выполнить кросс-компиляцию в виртуальной машине. Но я убедился на собственном опыте, что родной компьютер работает гораздо быстрее и выдает меньше ошибок.
Посмотрите на пути к файлам и ip-адреса в моих примерах кода и подкорректируйте их под свои нужды.
Узнайте версии gcc, ld и ldd. Для последующей сборки кросс-компилятора следует загрузить исходный код той же версии.
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.
Добавьте следующий фрагмент кода в конец ~/.bashrc и обновите изменения:
Соберите последнюю версию cmake из исходных текстов:
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
Сборка gcc в качестве кросс-компилятора
Загрузите необходимые исходные тексты. Вы должны изменить следующие команды в соответствии с вашими потребностями. На момент создания этой страницы они таковы:
gcc 12.2.0
binutils 2.40 (ld-версия)
glibc 2.36 (версия 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
cd ~/gcc_all
cd linux
KERNEL=kernel7
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross-pi-gcc/aarch64-linux-gnu headers_install
Соберите 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
Отредактируйте gcc-12.2.0/libsanitizer/asan/asan_linux.cpp. Добавьте следующий фрагмент кода.
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
Выполните частичную сборку 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
Частичная сборка 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
Вернитесь к gcc.
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
Закончить сборку glibc.
cd ~/gcc_all/build-glibc
make -j8
make install
Закончить сборку gcc.
cd ~/gcc_all/build-gcc
make -j8
make install
На данный момент у нас есть полный набор инструментов кросс-компилятора с gcc. Папка gcc_all больше не нужна. Вы можете удалить ее.
Создание Qt6
Существует два варианта сборки Qt6. Можно загрузить версию "single" (https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.tar.xz), которая содержит qtbase и все подмодули. Это очень тяжелый материал, и для его компиляции требуется много сил и времени.
Я рекомендую скомпилировать qtbase как основу и затем компилировать только каждый подмодуль, который вам нужен, отдельно.
Создайте папки для sysroot и qt6. Я создаю эти папки в каталоге 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
Создайте файл с именем toolchain.cmake в ~/workspace/qt-rpi-cross-compilation/qt6.
Вам нужно настроить строку "set(TARGET_SYSROOT /home/factory/workspace/qt-rpi-cross-compilation/rpi-sysroot)" в соответствии с вашим окружением.
Если вы создаете проект в QtCreator, вам необходимо настроить конфигурацию "Run". На "Environment" необходимо добавить:
-LD_LIBRARY_PATH=:/usr/local/qt6/lib/
Добавьте субмодули Qt
Добавьте модуль QML
Загрузите исходные коды:
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
Вы должны проверить зависимости на ~/workspace/qt-rpi-cross-compilation/qt6/src/qtdeclarative-everywhere-src-6.8.0/dependencies.yaml и ~/workspace/qt-rpi-cross-compilation/qt6/src/qtshadertools-everywhere-src-6.8.0/dependencies.yaml.
Убедитесь, что необходимые модули должны быть собраны и установлены в первую очередь.