개요
목표
Ubuntu 22.04(Host PC)에서 Qt 6.5.1 라이브러리를 빌드(크로스 컴파일)하여 Raspberry Pi 4(ARM 보드)에서 Qt 기반 애플리케이션을 실행시키기
크로스 컴파일이란?
크로스 컴파일은 개발자가 사용하는 호스트 시스템(일반적으로 x86_64 pc)에서 타깃 시스템(ARM)용 실행 파일(바이너리)을 빌드하는 과정을 말한다. 이를 위해서는 대상 보드(ARM)에 맞는 툴체인(toolchain)과 sysroot 설정이 필요하다.
즉, 호스트와 타깃의 CPU 아키텍처나 운영체제가 다르기 때문에, 일반 컴파일러로는 생성된 바이너리가 타깃에서 실행되지 않는다. 이때, 타깃 시스템에 맞는 컴파일러, 링커, 라이브러리 등을 사용하는 크로스 컴파일 툴체인을 통해 올바른 실행 파일을 생성해야한다.
주로 임베디드 보드처럼 개발 환경이 제한적이거나 성능이 낮은 시스템에서 직접 컴파일하기 어려울 때 호스트 시스템에서 빠르게 빌드하고 그 결과물을 배포하기 위해 사용된다.
툴체인(toolchain) : ARM 환경에서 동작할 수 있는 C/C++ 컴파일러, 링커 등의 개발 도구 세트
sysroot : 라즈베리파이 운영체제(Raspberry Pi OS)의 라이브러리와 헤더 등, 바이너리를 빌드하는 데 필요한 환경
준비물
Raspberry Pi
사용 모델 : Raspberry Pi 4 Model B
사용 OS : Raspberry Pi OS (Legacy, 64-bit) Full - Bullseye
커널정보 : 6.1.21-v8+, aarch64(64Bit)
GCC 버전 : 10.2.1
LD 버전 : 2.35.2
LDD 버전 : 2.31
Host PC
virtual machine : VMware Workstation 17
사용 OS : Ubuntu-22.04.5-desktop-amd64
과정
Raspberry Pi Setting
1. SSH, VNC, Serial Port, Serial Console 사용
2. update, upgrade 하기
sudo apt update
sudo apt full-upgrade
sudo reboot
3. 필요한 패키지들 설치
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 gstreamer1.0-omx 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-dev
sudo 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
4. qt6 설치를 위한 폴더 만들기
sudo mkdir /usr/local/qt6
sudo chmod 777 /usr/local/bin
5. 환경 변수(LD_LIBRARY_PATH) 업데이트 및 적용
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/qt6/lib/
source ~/.bashrc
Host PC Setting
1. (Windows) RealVNC Viewer 설치 및 라즈베리파이 연결
2. (Linux) VMware로 Ubuntu 접속 및 update, upgrade 하기
sudo apt update
sudo apt upgrade
3. 필요한 패키지들 설치
sudo apt-get install make build-essential libclang-dev 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 build-essential gawk git texinfo bison file wget libssl-dev gdbserver gdb-multiarch libxcb-cursor-dev
4. 최신 CMake 빌드
cd ~
git clone https://github.com/Kitware/CMake.git
cd CMake
./bootstrap && make -j8&& sudo make install
5. gcc를 크로스 컴파일러로 빌드
자신에 맞는 gcc, ld, ldd 버전 확인하기
cd ~
mkdir gcc_all && cd gcc_all
wget https://ftpmirror.gnu.org/binutils/binutils-2.35.2.tar.bz2
wget https://ftpmirror.gnu.org/glibc/glibc-2.31.tar.bz2
wget https://ftpmirror.gnu.org/gcc/gcc-10.3.0/gcc-10.3.0.tar.gz
git clone --depth=1 https://github.com/raspberrypi/linux
tar xf binutils-2.35.2.tar.bz2
tar xf glibc-2.31.tar.bz2
tar xf gcc-10.3.0.tar.gz
rm *.tar.*
cd gcc-10.3.0
contrib/download_prerequisites
6. 컴파일러 설치를 위한 폴더 생성
sudo mkdir -p /opt/cross-pi-gcc
sudo chown $USER /opt/cross-pi-gcc
export PATH=/opt/cross-pi-gcc/bin:$PATH
7. 위 폴더에 있는 커널 헤더를 복사하기
cd ~/gcc_all
cd linux
KERNEL=kernel7
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross-pi-gcc/aarch64-linux-gnu headers_install
8. Binutils 빌드
cd ~/gcc_all
mkdir build-binutils && cd build-binutils
../binutils-2.35.2/configure --prefix=/opt/cross-pi-gcc --target=aarch64-linux-gnu --with-arch=armv8 --disable-multilib
make -j 8
make install
9. gcc-10.3.0/libsanitizer/asan/asan_linux.cpp 편집하기
아래의 코드를 삽입하기
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
10. gcc의 부분 빌드
cd ~/gcc_all
mkdir build-gcc && cd build-gcc
../gcc-10.3.0/configure --prefix=/opt/cross-pi-gcc --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
make -j8 all-gcc
make install-gcc
11. Glibc 부분 빌드
cd ~/gcc_all
mkdir build-glibc && cd build-glibc
../glibc-2.31/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
12. gcc로 돌아가기
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
13. Glibc 빌드 마무리
cd ~/gcc_all/build-glibc
make -j8
make install
14. gcc 빌드 마무리
cd ~/gcc_all/build-gcc
make -j8
make install
여기까지 하면 gcc를 포함한 완전한 크로스 컴파일러 toolchain을 가지게 된다.
15. sysroot와 qt6을 위한 폴더 생성
cd ~
mkdir rpi-sysroot rpi-sysroot/usr rpi-sysroot/opt
mkdir qt6 qt6/host qt6/pi qt6/host-build qt6/pi-build qt6/src
16. QtBase 소스 코드 다운로드
cd ~/qt6/src
wget https://download.qt.io/official_releases/qt/6.5/6.5.1/submodules/qtbase-everywhere-src-6.5.1.tar.xz
tar xf qtbase-everywhere-src-6.5.1.tar.xz
17. host를 위한 Qt6 빌드
cd $HOME/qt6/host-build/
cmake ../src/qtbase-everywhere-src-6.5.1/ -GNinja -DCMAKE_BUILD_TYPE=Release -DQT_BUILD_EXAMPLES=OFF -DQT_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=$HOME/qt6/host
cmake --build . --parallel 8
cmake --install .
18. sysroot 구성
Raspberry Pi 4에서 사용 중인 루트파일시스템을 Host PC로 rsync를 사용하여 복사해서 sysroot 디렉터리 구성
네트워크에 연결 되어있는 본인의 Raspberry Pi IP 주소 사용
cd ~
rsync -avz --rsync-path="sudo rsync" pi@192.168.0.155:/usr/include rpi-sysroot/usr
rsync -avz --rsync-path="sudo rsync" pi@192.168.0.155:/lib rpi-sysroot
rsync -avz --rsync-path="sudo rsync" pi@192.168.0.155:/usr/lib rpi-sysroot/usr
rsync -avz --rsync-path="sudo rsync" pi@192.168.0.155:/opt/vc rpi-sysroot/opt
19. $HOME/qt6에 toolchain.cmake 파일 생성
set(TARGET_SYSROOT /home/son/rpi-sysroot) 부분에 본인에 맞는 username 사용
cmake_minimum_required(VERSION 3.18)
include_guard(GLOBAL)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# You should change location of sysroot to your needs.
set(TARGET_SYSROOT /home/son/rpi-sysroot)
set(TARGET_ARCHITECTURE aarch64-linux-gnu)
set(CMAKE_SYSROOT ${TARGET_SYSROOT})
set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:${CMAKE_SYSROOT}/usr/lib/${TARGET_ARCHITECTURE}/pkgconfig)
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/${TARGET_ARCHITECTURE}/pkgconfig:${TARGET_SYSROOT}/usr/lib/pkgconfig)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
set(CMAKE_C_COMPILER /opt/cross-pi-gcc/bin/${TARGET_ARCHITECTURE}-gcc)
set(CMAKE_CXX_COMPILER /opt/cross-pi-gcc/bin/${TARGET_ARCHITECTURE}-g++)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isystem=/usr/include -isystem=/usr/local/include -isystem=/usr/include/${TARGET_ARCHITECTURE}")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
set(QT_COMPILER_FLAGS "-march=armv8-a")
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe")
set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-rpath-link=${TARGET_SYSROOT}/usr/lib/${TARGET_ARCHITECTURE} -Wl,-rpath-link=$HOME/qt6/pi/lib")
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/${TARGET_ARCHITECTURE}/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib)
set(EGL_INCLUDE_DIR ${GL_INC_DIR})
set(EGL_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/${TARGET_ARCHITECTURE}/libEGL.so)
set(OPENGL_INCLUDE_DIR ${GL_INC_DIR})
set(OPENGL_opengl_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/${TARGET_ARCHITECTURE}/libOpenGL.so)
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLIB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/${TARGET_ARCHITECTURE}/libGLESv2.so)
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLESv2_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/${TARGET_ARCHITECTURE}/libGLESv2.so)
set(gbm_INCLUDE_DIR ${GL_INC_DIR})
set(gbm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/${TARGET_ARCHITECTURE}/libgbm.so)
set(Libdrm_INCLUDE_DIR ${GL_INC_DIR})
set(Libdrm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/${TARGET_ARCHITECTURE}/libdrm.so)
set(XCB_XCB_INCLUDE_DIR ${GL_INC_DIR})
set(XCB_XCB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/${TARGET_ARCHITECTURE}/libxcb.so)
list(APPEND CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/usr/lib/${TARGET_ARCHITECTURE})
list(APPEND CMAKE_PREFIX_PATH "/usr/lib/${TARGET_ARCHITECTURE}/cmake")
20. 절대 심볼릭 링크 수정
cd ~
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
python3 sysroot-relativelinks.py rpi-sysroot
21. Raspberry Pi를 위한 소스 코드 컴파일
cd $HOME/qt6/pi-build
cmake ../src/qtbase-everywhere-src-6.5.1/ -GNinja -DCMAKE_BUILD_TYPE=Release -DINPUT_opengl=es2 -DQT_BUILD_EXAMPLES=OFF -DQT_BUILD_TESTS=OFF -DQT_HOST_PATH=$HOME/qt6/host -DCMAKE_STAGING_PREFIX=$HOME/qt6/pi -DCMAKE_INSTALL_PREFIX=/usr/local/qt6 -DCMAKE_TOOLCHAIN_FILE=$HOME/qt6/toolchain.cmake -DQT_QMAKE_TARGET_MKSPEC=devices/linux-rasp-pi4-aarch64 -DQT_FEATURE_xcb=ON -DFEATURE_xcb_xlib=ON -DQT_FEATURE_xlib=ON
cmake --build . --parallel 8
cmake --install .
22. binaries를 Raspberry Pi로 전송
실행 파일, 라이브러리 등 크로스 컴파일 과정에서 생선 된 결과물을 Raspberry Pi로 보낸다.
Qt를 ARM 아키텍처용으로 빌드한 결과물을 실제 Raspberry Pi 기기 안에 설치(배포)하는 과정이다.
rsync -avz --rsync-path="sudo rsync" $HOME/qt6/pi/* pi@192.168.0.155:/usr/local/qt6
23. Qt Creator Host PC에 설치하기
wget https://download.qt.io/official_releases/qtcreator/15.0/15.0.0/qt-creator-opensource-linux-x86_64-15.0.0.run
Host PC Qt Creator Setting
1. Compilers 설정
2. Debuggers 설정
3. Devices 설정
Private Key file에서 Create New를 눌러 Generate And Save Key Pair를 누르기
우측의 Deploy Public Key 누르기
우측의 Test 누르기
4. Qt Versions 설정
5. Kits 설정
CMake Configuration change 버튼을 클릭하여 아래 문구 추가하기
-DCMAKE_TOOLCHAIN_FILE:UNINITIALIZED=/home/son/qt6/pi/lib/cmake/Qt6/qt.toolchain.cmake
5. 프로젝트 생성 및 설정
Qt Widgets Application 생성
Projects Build & Run 수정
X11 Forwarding Enable 체크
Environment에 아래 문구 추가하기
LD_LIBRARY_PATH=:/usr/local/qt6/lib/
6. 프로젝트 실행
libQt6DBus 에러가 많이 발생한다.
해결방법
- Qt 모듈을 명시적으로 찾기
- 링크 단계에서 라이브러리를 연결
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
target_link_libraries(HelloWorld PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
기존의 CMakeList.txt 파일에 위의 코드를 아래로 수정하면 된다.
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Gui Widgets DBus)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Widgets DBus)
target_link_libraries(HelloWorld
PRIVATE
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::DBus
)
수정 후 다시 빌드하고 실행하면 아래와 같이 테스트 프로그램이 잘 실행된다.
7. QML module 소스코드 다운로드
cd ~/qt6/src
wget https://download.qt.io/official_releases/qt/6.5/6.5.1/submodules/qtshadertools-everywhere-src-6.5.1.tar.xz
tar xf qtshadertools-everywhere-src-6.5.1.tar.xz
wget https://download.qt.io/official_releases/qt/6.5/6.5.1/submodules/qtdeclarative-everywhere-src-6.5.1.tar.xz
tar xf qtdeclarative-everywhere-src-6.5.1.tar.xz
8. Host를 위한 module 빌드
cd ~/qt6/host-build
rm -rf *
$HOME/qt6/host/bin/qt-configure-module ../src/qtshadertools-everywhere-src-6.5.1
cmake --build . --parallel 8
cmake --install .
rm -rf *
$HOME/qt6/host/bin/qt-configure-module ../src/qtdeclarative-everywhere-src-6.5.1
cmake --build . --parallel 8
cmake --install .
9. Raspberry Pi를 위한 module 빌드
cd ~/qt6/pi-build
rm -rf *
$HOME/qt6/pi/bin/qt-configure-module ../src/qtshadertools-everywhere-src-6.5.1
cmake --build . --parallel 8
cmake --install .
rm -rf *
$HOME/qt6/pi/bin/qt-configure-module ../src/qtdeclarative-everywhere-src-6.5.1
cmake --build . --parallel 8
cmake --install .
10. binaries를 Raspberry Pi로 전송
네트워크에 연결된 본인의 Raspberry Pi IP주소
rsync -avz --rsync-path="sudo rsync" $HOME/qt6/pi/* pi@192.168.0.155:/usr/local/qt6
qml 파일이 Raspberry Pi에 생성됨
11. 프로젝트 생성 및 설정
Qt Quick Application으로 프로젝트 생성
위의 테스트 예제와 동일하게 설정
12. 프로젝트 실행
이대로 실행하게 되면 Qt Widgets Applicaion 예제와 동일하게 에러가 발생한다.
따라서 CMakeLists.txt파일을 수정해야 한다.
find_package(Qt6 REQUIRED COMPONENTS Core Qml Quick DBus)
target_link_libraries(appHelloWorldQml
PRIVATE
Qt6::Core
Qt6::Qml
Qt6::Quick
Qt6::DBus
)
패키지와 링크에 명시하기
추가사항
Qt Creator에서 리모트 실행말고 배포할 때 주의사항
Release 모드로 리모트 실행을 하고 Release 파일을 라즈베리파이로 보낸다.
scp -r /home/son/project/ForTex7/build/RPI-Release pi@192.168.0.155:/home/pi
라즈베리파이에서 실행
cd /home/pi/RPI-Release
./appForTex7
GUI가 나오지 않는다면 LD_LIBRARY_PATH 환경변수가 필요하다.
아래의 2가지 방법이 있다.
1. LD_LIBRARY_PATH 사용 (일회용)
라즈베리파이에서 실행하기 전, 환경 변수를 통해 라이브러리 경로를 잡아주고 실행한다.
export LD_LIBRARY_PATH=/usr/local/qt6/lib:$LD_LIBRARY_PATH
cd ~/RPI-Release
./appForTex7
2. 시스템 전체에 등록하기 (영구 설정)
라즈베리파이에 /usr/local/qt6/lib를 시스템 전역 라이브러리 경로로 등록하면 LD_LIBRARY_PATH 설정 없이도 라이브러를 찾을 수 있다.
echo "/usr/local/qt6/lib" | sudo tee /etc/ld.so.conf.d/qt6.conf
sudo ldconfig
후기
일주일 정도 자료들을 찾으면서 여러 시도를 해보았다.
WSL2를 사용하여 Raspberry Pi CM3 (32Bit)에 크로스 컴파일을 하려고 했으나 자료가 별로 없었고 버전이 맞지 않았는지 에러 지옥에서 벗어나지 못하였다.
우선 64bit Rasberry Pi 4에 크로스 컴파일을 하여 Qt6을 실행해 보려고 WSL2를 사용해 우분투를 세팅하고 2,3일 정도 고전하였다. 버전이 맞지 않았는지 또 에러 지옥에 빠졌다.
이대론 안 되겠다 싶어 WSL 말고 VMware로 갈아탔다. 시각적으로 보이니까 확실히 수월했다. 자료를 찾다 보니 유튜브와 깃허브에 Qt6 크로스 컴파일의 자세한 과정이 있어서 큰 도움이 되었다.
결론적으로 일주일 간의 시도는 Raspberry Pi의 GCC, LD, LDD 버전과 Host PC의 버전이 맞지 않아서 발생한 에러들이었고 이 부분을 맞추고 나니 수월하게 진행되었다.
참고자료
https://github.com/MuyePan/CrossCompileQtForRpi
GitHub - MuyePan/CrossCompileQtForRpi
Contribute to MuyePan/CrossCompileQtForRpi development by creating an account on GitHub.
github.com
https://www.youtube.com/watch?v=Xp-Out6wS2I