من در مورد نصب Raspbian در Raspberry Compute Module و راه اندازی کامپایل متقابل برای QtCreator در اوبونتو 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
یادداشت
اگر یک لپ تاپ یا رایانه رومیزی با رم و هسته های CPU کافی دارید، می توانید کامپایل متقابل را در یک ماشین مجازی انجام دهید. اما من این تجربه را داشتم که یک کامپیوتر بومی بسیار سریعتر است و خطاهای کمتری تولید می کند.
به مسیرهای فایل و آدرس های 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 اضافه کنید و تغییرات را به روز کنید:
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
بازگشت به شورای همکاری خلیج فارس.
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 دیگر نیازی نیست. می توانید آن را حذف کنید.</:code19:></:code18:></:code17:></:code16:></:code15:></:code14:></:code13:></:code12:></:code11:></:code10:></:code9:></:code8:></:code7:>
ساختمان 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بررسی کنید.
مطمئن شوید که ابتدا ماژول های مورد نیاز باید ساخته و نصب شوند.