แนะ นำ
ในบล็อกโพสต์ก่อนหน้านี้ ติดตั้ง Raspberry Pi OS บน Raspberry Compute Module 4 ฉันเขียนเกี่ยวกับการติดตั้ง Raspbian บน Raspberry Compute Module และตั้งค่าการคอมไพล์ข้ามสําหรับ QtCreator บน Ubuntu 20
บล็อกโพสต์นี้เป็นการอัปเดต - ในขณะนี้ - เวอร์ชันใหม่ล่าสุด 6.10 ของ Qt, RaspiOS Trixie และ Ubuntu 24.04 LTS.
ในกรณีนี้ฉันใช้เครื่องเสมือนที่สร้างขึ้นด้วย UTM บน MacBook Pro M1
ข้อกําหนด
- Raspberry Pi Compute Module 5* MacBook Pro M1 ที่ติดตั้ง UTM
- Ubuntu 24.0.4 LTS, arm64
- Qt เวอร์ชัน 6.10.1
- QtCreator 18
การติดตั้งและตั้งค่า Compute Module 5 และ Ubuntu ใน UTM ไม่ใช่เนื้อหาของบล็อกโพสต์นี้ เนื่องจากมี tuturials มากมายที่สามารถหาได้ในอินเทอร์เน็ต
ตั้งค่า Raspberry CM5
- แฟลชภาพเป็น eMMC ด้วย Raspberry Pi Imager
- ทําตามการติดตั้งและอย่าลืมการตั้งค่าสําหรับการเชื่อมต่อระยะไกล (ssh)
- เชื่อมต่อกับ RPi ด้วย ssh -> ในกรณีของฉันกับที่อยู่ IP 192.168.2.194 และผู้ใช้ pi -> จากโฮสต์ Ubuntu ของคุณ
ssh [email protected]- ติดตั้งซอฟต์แวร์ที่จําเป็น:
sudo apt-get install libboost-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev libasound2-dev libpulse-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-alsa libvpx-dev libsrtp2-dev libsnappy-dev libnss3-dev "^libxcb.*" flex bison libxslt-dev ruby gperf libbz2-dev libcups2-dev libatkmm-1.6-dev libxi6 libxcomposite1 libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libx11-dev freetds-dev libsqlite3-dev libpq-dev libiodbc2-dev firebird-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev libatspi2.0-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev libxkbcommon-x11-dev gdbserver- สร้างโฟลเดอร์สําหรับการติดตั้ง Qt 6:
sudo mkdir /usr/local/qt6- ผนวกโค้ดต่อไปนี้ต่อท้าย ~/.bashrc และอัปเดตการเปลี่ยนแปลง:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/qt6/lib/
source ~/.bashrcตั้งค่า Ubuntu 24.04 LTS
- อัปเดตเป็นเวอร์ชันล่าสุดของแพ็คเกจซอฟต์แวร์:
sudo apt update
sudo apt upgrade- ติดตั้งแพ็คเกจต่อไปนี้:
sudo apt-get install make cmake build-essential libclang-dev clang ninja-build gcc git bison python3 gperf pkg-config libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev python3-html5lib libxcb-dri3-dev libxkbfile-dev libxshmfence-dev libxrandr-dev libxcursor-dev libxcomposite-dev libdrm-dev libwayland-devอาคาร Qt6
มีความเป็นไปได้สองประการในการสร้าง Qt6 มีเวอร์ชัน"single" (https://download.qt.io/official_releases/qt/6.10/6.10.1/single/qt-everywhere-src-6.10.1.tar.xz)ให้ดาวน์โหลดซึ่งมีqtbaseและโมดูลย่อยทั้งหมด นี่เป็นสิ่งที่หนักมากและต้องใช้พลังงานและเวลามากในการรวบรวม
คําแนะนําของฉันคือ ให้คอมไพล์ qtbase เป็นพื้นฐาน และหลังจากนั้นให้คอมไพล์เฉพาะแต่ละโมดูลย่อยที่คุณต้องการแยกกัน
- สร้างโฟลเดอร์สําหรับ sysroot และ qt6 ฉันสร้างโฟลเดอร์นี้ในไดเรกทอรี Documents/Cross-Compile/raspi-os-trixie ของฉัน
mkdir ~/Documents/Qt-Cross-Compile ~/Documents/Qt-Cross-Compile/raspi-os-trixie
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie
mkdir rpi-sysroot rpi-sysroot/usr rpi-sysroot/opt
mkdir qt6 qt6/host qt6/pi qt6/host-build qt6/pi-build qt6/src- ดาวน์โหลดซอร์สโค้ด QtBase
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/src
wget https://download.qt.io/official_releases/qt/6.10/6.10.1/submodules/qtbase-everywhere-src-6.10.1.tar.xz
tar xf qtbase-everywhere-src-6.10.1.tar.xz- เปลี่ยนชื่อ qtbase-everywhere-src-6.10.1 เป็น qtbase เนื่องจาก qttranslations ไม่สามารถทํางานกับ qtbase-everywhere-src-6.10.1 ได้
mv qtbase-everywhere-src-6.10.1 qtbaseสร้าง Qt6 สําหรับโฮสต์
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/host-build
cmake ../src/qtbase/ -GNinja -DCMAKE_BUILD_TYPE=Release -DQT_BUILD_EXAMPLES=OFF -DQT_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=$HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/host
cmake --build . --parallel 8
cmake --install .ไบนารีจะอยู่ใน ~/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/host
สร้าง Qt6 สําหรับ rpi
คัดลอกและวางโฟลเดอร์สองสามโฟลเดอร์จาก rpi โดยใช้ rsync ผ่าน SSH
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie
rsync -avzS --rsync-path="rsync" --delete [email protected]:/lib/* ~/Documents/Qt-Cross-Compile/raspi-os-trixie/rpi-sysroot/lib
rsync -avzS --rsync-path="rsync" --delete [email protected]:/usr/include/* ~/Documents/Qt-Cross-Compile/raspi-os-trixie/rpi-sysroot/usr/include
rsync -avzS --rsync-path="rsync" --delete [email protected]:/usr/lib/* ~/Documents/Qt-Cross-Compile/raspi-os-trixie/rpi-sysroot/usr/lib
rsync -avzS --rsync-path="rsync" --delete [email protected]:/opt/vc ~/Documents/Qt-Cross-Compile/raspi-os-trixie/rpi-sysroot/opt/vc- สร้างไฟล์ชื่อ toolchain.cmake ใน ~/Documents/Qt-Cross-Compile/raspi-os-trixie
คุณต้องปรับบรรทัด "set(TARGET_SYSROOT ~/Documents/Qt-Cross-Compile/raspi-os-trixie/rpi-sysroot)" ให้เข้ากับสภาพแวดล้อมของคุณ
cmake_minimum_required(VERSION 3.18)
include_guard(GLOBAL)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TARGET_SYSROOT /home/whale/Documents/Qt-Cross-Compile/raspi-os-trixie/rpi-sysroot)
set(CMAKE_SYSROOT ${TARGET_SYSROOT})
set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig)
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig:${TARGET_SYSROOT}/usr/lib/pkgconfig)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
# if you use other version of gcc and g++ than gcc/g++ 9, you must change the following variables
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc-13)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++-13)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
set(QT_COMPILER_FLAGS "-march=armv8-a")
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe -DNDEBUG")
set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_BUILD_RPATH ${TARGET_SYSROOT})
include(CMakeInitializeConfigs)
function(cmake_initialize_per_config_variable _PREFIX _DOCSTRING)
if (_PREFIX MATCHES "CMAKE_(C|CXX|ASM)_FLAGS")
set(CMAKE_${CMAKE_MATCH_1}_FLAGS_INIT "${QT_COMPILER_FLAGS}")
foreach (config DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
if (DEFINED QT_COMPILER_FLAGS_${config})
set(CMAKE_${CMAKE_MATCH_1}_FLAGS_${config}_INIT "${QT_COMPILER_FLAGS_${config}}")
endif()
endforeach()
endif()
if (_PREFIX MATCHES "CMAKE_(SHARED|MODULE|EXE)_LINKER_FLAGS")
foreach (config SHARED MODULE EXE)
set(CMAKE_${config}_LINKER_FLAGS_INIT "${QT_LINKER_FLAGS}")
endforeach()
endif()
_cmake_initialize_per_config_variable(${ARGV})
endfunction()
set(XCB_PATH_VARIABLE ${TARGET_SYSROOT})
set(GL_INC_DIR ${TARGET_SYSROOT}/usr/include)
set(GL_LIB_DIR ${TARGET_SYSROOT}:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib)
set(EGL_INCLUDE_DIR ${GL_INC_DIR})
set(EGL_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libEGL.so)
set(OPENGL_INCLUDE_DIR ${GL_INC_DIR})
set(OPENGL_opengl_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libOpenGL.so)
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLESv2_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libGLESv2.so)
set(gbm_INCLUDE_DIR ${GL_INC_DIR})
set(gbm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libgbm.so)
set(Libdrm_INCLUDE_DIR ${GL_INC_DIR})
set(Libdrm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libdrm.so)
set(XCB_XCB_INCLUDE_DIR ${GL_INC_DIR})
set(XCB_XCB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/aarch64-linux-gnu/libxcb.so)- แก้ไขลิงก์สัญลักษณ์แบบสัมบูรณ์
sudo apt install symlinks
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie
symlinks -rc rpi-sysroot- คอมไพล์ซอร์สโค้ดสําหรับ rpi
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/pi-build
cmake ../src/qtbase/ -GNinja -DCMAKE_BUILD_TYPE=Release -DINPUT_opengl=es2 -DQT_BUILD_EXAMPLES=OFF -DQT_BUILD_TESTS=OFF -DQT_HOST_PATH=$HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/host -DCMAKE_STAGING_PREFIX=$HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/pi -DCMAKE_INSTALL_PREFIX=/usr/local/qt6 -DCMAKE_TOOLCHAIN_FILE=$HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/toolchain.cmake -DQT_QMAKE_TARGET_MKSPEC=devices/linux-rasp-pi4-aarch64 -DQT_FEATURE_wayland=ON
cmake --build . --parallel 8
cmake --install .- ส่งไบนารีไปยัง rpi
rsync -avz --rsync-path="sudo rsync" $HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/pi/* [email protected]:/usr/local/qt6กําหนดค่า QtCreator
ตั้งค่าคอมไพเลอร์
ตั้งค่าดีบักเกอร์
ตั้งค่าอุปกรณ์
ทดสอบการเชื่อมต่อด้วยปุ่ม "ทดสอบ"ตั้งค่าเวอร์ชัน Qt
ชุดอุปกรณ์การตั้งค่า
ปรับแต่งการตั้งค่าสร้าง ปรับใช้ และเรียกใช้
เพิ่มโมดูลย่อย Qt
- ดาวน์โหลดซอร์สโค้ด:
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/src
wget https://download.qt.io/official_releases/qt/6.10/6.10.1/submodules/qttools-everywhere-src-6.10.1.tar.xz
tar xf qttools-everywhere-src-6.10.1.tar.xz
mv qttools-everywhere-src-6.10.1 qttoolsคุณต้องตรวจสอบการพึ่งพาที่ /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.
ตรวจสอบให้แน่ใจว่าควรสร้างและติดตั้งโมดูลที่จําเป็นก่อน
- สร้างโมดูลสําหรับโฮสต์
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/host-build
rm -rf *
$HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/host/bin/qt-configure-module ../src/qttools
cmake --build . --parallel 8
cmake --install .- สร้างโมดูลสําหรับ rpi
cd ~/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/pi-build
rm -rf *
$HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/pi/bin/qt-configure-module ../src/qttools
cmake --build . --parallel 8
cmake --install .- ส่งไบนารีไปยัง rpi
rsync -avz --rsync-path="sudo rsync" $HOME/Documents/Qt-Cross-Compile/raspi-os-trixie/qt6/pi/* [email protected]:/usr/local/qt6กิตติคุณ
แหล่งที่มาที่ใช้ในการสร้างคําแนะนํานี้: