소개
이전 블로그 포스트에서 Install Raspberry Pi OS on the Raspberry Compute Module 4 라즈베리 컴퓨트 모듈에 라즈비안을 설치하고 우분투 20에서 QtCreator를 위한 교차 컴파일을 설정하는 방법에 대해 썼습니다.
이 블로그 포스트는 현재 최신 버전인 Qt 6.10에 대한 업데이트입니다( RaspiOS Trixie 및 Ubuntu 24.04 LTS).
여기서는 MacBook Pro M1에서 UTM으로 생성한 가상 머신을 사용했습니다.
요구 사항
- Raspberry Pi Compute Module 5
- UTM이 설치된 MacBook Pro M1
- 우분투 24.0.4 LTS, arm64
- Qt 버전 6.10.1
- QtCreator 18
인터넷에서 많은 튜토리얼을 찾을 수 있으므로 컴퓨트 모듈 5 및 UTM에서 Ubuntu의 설치 및 설정은 이 블로그 포스트의 내용이 아닙니다.
라즈베리 CM5 설정
- 플래시 이미지를 eMMC로 Raspberry Pi 이미저
- 설치를 따르고 원격 연결(ssh) 설정을 잊지 마세요.
- ssh -> 제 경우에는 IP 주소 192.168.2.194 및 사용자 pi -> Ubuntu 호스트에서 RPi에 연결합니다.
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우분투 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-devQt6 구축
Qt6를 빌드하는 방법은 두 가지가 있습니다. qtbase 및 모든 서브모듈이 포함된 "single" (https://download.qt.io/official_releases/qt/6.10/6.10.1/single/qt-everywhere-src-6.10.1.tar.xz) 버전을 다운로드할 수 있습니다. 이 버전은 매우 무겁고 컴파일하는 데 많은 파워와 시간이 필요합니다.
제가 추천하는 방법은 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에서는 qttranslations가 작동하지 않으므로 qtbase-everywhere-src-6.10.1의 이름을 qtbase로 바꿉니다.
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에 있습니다.
rpi용 Qt6 빌드
SSH를 통해 rsync를 사용하여 rpi에서 몇 개의 폴더를 복사하여 붙여넣습니다.
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- Documents/Qt-Cross-Compile/raspi-os-trixie에 toolchain.cmake라는 파일을 만듭니다.
"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/qt6QtCreator 구성
컴파일러 설정
Set up Debuggers
Set up Devices
Test the connection with the button "Test"Set up Qt Versions
Set up Kits
Customize build, deploy and run settings
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감사
이 지침을 만드는 데 사용된 소스입니다: