Saya menulis tentang instalasi Raspbian di Raspberry Compute Module dan setup cross compile untuk QtCreator di Ubuntu 20.
Blogpost ini adalah update untuk - pada saat ini - versi 6.8 terbaru dari Qt, raspi OS Bookworm dan Ubuntu 22.04 LTS.
Prasyarat
Saya menggunakan perangkat keras dan perangkat lunak berikut ini:
Raspberry Pi 4
raspi OS Bookworm, tanpa perangkat lunak yang direkomendasikan
Ubuntu 22.04 LTS
Qt 6.8
QtCreator 14.02
Catatan
Jika Anda memiliki laptop atau komputer desktop dengan RAM dan inti CPU yang cukup, Anda dapat melakukan kompilasi silang di mesin virtual. Tetapi saya mendapatkan pengalaman, bahwa komputer asli jauh lebih cepat dan menghasilkan lebih sedikit kesalahan.
Lihatlah jalur file dan alamat ip dalam contoh kode saya dan sesuaikan dengan kebutuhan Anda.
Temukan versi gcc, ld dan ldd. Kode sumber dari versi yang sama harus diunduh untuk membangun kompiler silang nantinya.
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.
Tambahkan potongan kode berikut ke akhir ~/.bashrc dan perbarui perubahannya:
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
Bangun gcc sebagai kompiler silang
Unduh kode sumber yang diperlukan. Anda harus memodifikasi perintah-perintah berikut ini sesuai dengan kebutuhan Anda. Pada saat saya membuat halaman ini, perintah-perintah tersebut adalah:
gcc 12.2.0
binutils 2.40 (versi ld)
glibc 2.36 (versi ld)
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
Bangun 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
Edit gcc-12.2.0/libsanitizer/asan/asan_linux.cpp. Tambahkan potongan kode berikut ini.
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
Lakukan build parsial dari 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
Lakukan build sebagian dari 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
Kembali ke gcc.
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
Selesai membangun glibc.
cd ~/gcc_all/build-glibc
make -j8
make install
Selesai membangun gcc.
cd ~/gcc_all/build-gcc
make -j8
make install
Pada titik ini, kita memiliki toolchain kompiler silang penuh dengan gcc. Folder gcc_all tidak diperlukan lagi. Anda dapat menghapusnya.
Membangun Qt6
Ada dua kemungkinan untuk membangun Qt6. Ada versi "single" (https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.tar.xz) yang dapat diunduh, yang berisi qtbase dan semua submodul. Ini adalah hal yang sangat berat dan membutuhkan banyak tenaga dan waktu untuk mengkompilasinya.
Rekomendasi saya adalah, kompilasi qtbase sebagai dasar dan setelah itu kompilasi setiap submodul yang Anda perlukan secara terpisah.
Buatlah folder untuk sysroot dan qt6. Saya membuat folder ini di direktori 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
Buat sebuah berkas bernama toolchain.cmake di ~/workspace/qt-rpi-cross-compilation/qt6.
Anda perlu menyesuaikan baris "set(TARGET_SYSROOT /home/factory/workspace/qt-rpi-cross-compilation/rpi-sysroot)" ke lingkungan Anda.
Jika Anda membuat sebuah proyek di QtCreator, Anda harus menyesuaikan konfigurasi "Run". Di "Environment" Anda harus menambahkan:
-LD_LIBRARY_PATH=:/usr/local/qt6/lib/
Menambahkan Submodul Qt
Tambahkan modul QML
Unduh kode sumber:
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
Anda harus memeriksa dependensi di ~/workspace/qt-rpi-cross-compilation/qt6/src/qtdeclarative-everywhere-src-6.8.0/dependencies.yaml dan ~/workspace/qt-rpi-cross-compilation/qt6/src/qtshadertools-everywhere-src-6.8.0/dependencies.yaml.
Pastikan modul-modul yang diperlukan harus dibangun dan diinstal terlebih dahulu.