Qt5 윈도우에서 라즈베리파이 크로스 컴파일 환경만들기

김준형·2024년 4월 19일

환경

  • 라즈베리파이 3B (타겟)
  • Windows 10 (호스트)
  • Qt5.12.x
  • winscp
  • SmartTTY

목차

  1. 라즈베리파이 설치 및 환경 구성
  2. windows 필요 설치 및 환경 구성
  3. Qt 빌드 환경 구성 및 실행

라즈베리파이 설치 및 환경 구성

  1. https://www.raspberrypi.org/downloads/raspbian/
    이미지를 다운 받아 sd메모리에 쓰고 부팅하여 ssh를 활성화 합니다.

  2. SmartTTY tool을 이요해 ssh로 라즈베리파이에 접속합니다.

  3. 접속하여 아래 명령어를 실행합니다.
    sudo apt update

  4. 라즈베리파이의 GPU 메모리를 256으로 할당합니다.

  5. sudo vi /etc/bash.bashrc 명령어를 입력하여 파일을 연 후 맨아래에 export LD_LIBRARY_PATH=/opt/vc/lib 설정하고 저장합니다.
    /etc/bash.bashrc

  6. sudo vi /boot/config.txt 명령어를 입력하여 파일을 연 후 dtoverlay=vc4-kms-v3d줄을 주석처리하고 저장한다.
    /boot/config.txt

라즈베리파이 사전 설치 및 환경 구성은 완료되었으며 reboot해줍니다. 이 후 Qt 빌드 환경 구성 및 실행 시 추가적으로 설정하는 부분은 아래에 나올 것 입니다.

windows 필요 설치 및 환경 구성

1. Qt5.12.6 설치

설치1
설치2
설치3
Component 선택을 전부 선택해줬습니다. 라즈베리파이에 불필요하다 싶은건 설치하지 않아도 되지만 저는 우선 전부 선택했습니다.
설치4
설치5

2. ToolChains 다운로드 및 설치

3. python 설치

  • python 2.7.5 이후 버전 설치합니다.
    https://python.org/downloads/
  • 설치 후에 Windows 환경변수를 지정해줍니다.
  • 웹 엔진을 사용하기위해 구축하려면 Python이 필요합니다.

4. Raspberry ToolChain Sysroot 동기화

SmartTTY 실행하여 라즈베리파이에 ssh접속 합니다.
SSH 접속1
SSH 접속2
SSH 접속3

scp탭에 Download a directory를 선택하여 아래 파일들을windows에 C:\sysgcc\Raspberry\arm-linux-gnueabihf\sysroot 경로로 다운합니다.
/lib
/usr/include
/usr/lib
/usr/local/include/
/usr/local/lib

windows로 파일 다운로드

다운로드 중 계정의 권한이나 폴더가 없어서 실패하는 경우가 발생합니다. 아래 이미지처럼.
다운로드 중 에러
에러나는부분은 패스하고 진행하면 됩니다. 나머지부분은 복사가 완료됩니다.

이제 라즈베리파이에 대해 EGLFS 지원을 활성화하려고 합니다.
기본적으로 해당 라이브러리는 다음과 같아야합니다.
로컬에 opt/lib폴더에 있습니다.
C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\arm-linux-gnueabihf로 이동하여 libEGL.so.1 그리고 LIBGLESv2.so.2를 C:\SysGCC\raspberry\arm-linuxgnueabihf\sysroot\opt\vc\lib 와 C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot로 복사합니다.
그리고 libEGL.so와 libGLESv2.so으로 이름을 변경합니다.
opt/vc/lib폴더에 libEGL_static.a를 libEGL.a로 libEGLSv2_static.a를 libGLESv2.a로 이름을 변경합니다.

5. qmake.conf파일 수정

Qt Creator를 설치한 폴더로 이동합니다.
(C:\Qt\Qt5.12.6\5.12.6)
이동한 폴더에서 raspberry라는 폴더명을 만듭니다.
raspberry폴더 만들기

만든 raspberry폴더에 Src폴더를 복사합니다.
src 복사

C:\Qt\Qt5.12.6\5.12.6\raspberry\Src\qtbase\mkspecs\linux-arm-gnueabi-g++폴더로 이동해 qmake.conf파일을 열어 arm-linux-gnueabi-문구를 arm-linux-gnueabihf-로 전체 수정합니다.
linux-arm-gnueabig++\qmake.conf 수정 전
linux-arm-gnueabig++\qmake.conf 수정 후

C:\Qt\Qt5.12.6\5.12.6\raspberry\Src\qtbase\mkspecs\win32-g++폴더로 이동해 qmake.conf파일을 열어 CXXFLAGS에 -USTRICT_ANSI를 추가합니다.
win32-g++\qmake.conf 수정 전
win32-g++\qmake.conf 수정 후

6. Qt5.12.x 라즈베리파이3 빌드

C:\Qt\Qt5.12.6\5.12.6\raspberry폴더로 이동하여 build폴더를 생성합니다.
build폴더에서 c:\SysGCC\MinGW32\msys\1.0\msys.bat를 실행합니다.
그리고 실행된 msys.bat파일로 빌드폴더로 이동하여 빌드 명령어를 실행합니다.
(../Src/configure -platform win32-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -release -opengl es2 -device linux-rasp-pi3-g++ -sysroot C:/SysGCC/Raspberry/arm-linux-gnueabihf/sysroot -nomake examples -nomake tests -no-use-gold-linker -qt-pcre -opensource -confirm-license -IC:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot/opt/vc/include -L C:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot/opt/vc/lib)
아래 이미지들을 참고하세요.
msys.bat호출 및 빌드폴더 이동
빌드 구성하기
명령어 실행이 완료되면 make 명령어를 실행합니다.
엄청 오래걸립니다. 이점 참고하세요
make 실행

qtscript를 빌드하는 동안 아래 이미지처럼 오류가 발생할 수 있습니다.
make 오류
그렇다면 make -i 옵션을 주어 명령어를 다시 실행합니다.
make -i 실행하기
make가 성공적으로 끝났습니다.
make 성공

make가 끝났으면 make install -i 명령어를 실행해 설치합니다.
설치하기

작업이 완료되었습니다.
설치 완료

7. 라즈베리파이로 빌드 복사

make가 완료 되면 qt빌드는 C:\SysGCC\raspberry\arm-linuxgnueabihf\sysroot\usr\local\Qt-5.12.x 에서 확인할 수 있습니다.

우선 타겟인 라즈베리파이로 ssh 접속 후 /usr/local에 Qt-5.12.x폴더를 생성해주고 복사할 수 있는 권한을 생성합니다.
폴더생성
권한부여

qt 빌드파일을 라즈베리파이 환경인 /usr/local/Qt-5.12.x/ 에 복사합니다. (winscp를 사용했습니다.)
라즈베리파이에 파일 복사

8. EGLFS 활성화

windows에 있는 C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\opt\vc에 파일들을 타켓인 라즈베리파이에 /opt/vc 폴더안에 복사한다.
권한이 필요하니 타겟인 라즈베리파이에 vc폴더를 생성해준다.(아래 이미지 참고)
vc폴더 생성 후 권한 부여
생성된 vc폴더에 windows에 있는 vc 파일들을 복사해준다.
라즈베리파이에 vc폴더 안에 파일들 복사
타겟인 라즈베리파이에서 복사완료된 /opt/vc/lib로 이동하여 EGLFS 라이브러리를 심볼릭 링크를 생성합니다.
sudo ln –s libbrcmEGL.so libEGL.so.1
sudo ln –s libbrcmGLESv2.so libGLESv2.so.2

Qt 빌드 환경 구성

Windows에서 설치한 Qt Creator를 열어 Tools->Options->Kits->Qt Versions로 이동하여 Add버튼을 클릭하여 C:\SysGCC\raspberry\arm-linuxgnueabihf\sysroot\usr\local\Qt-5.13.2\bin폴더로 이동하여 qmake.exe를 선택합니다.
qmake 설정하기
kits 탭으로 이동하여 Add버튼을 클릭하고 raspberry pi라는 이름을 등록하고 Deivce는 Generic Linux Device(default for Generic Linux)를 선택합니다.
(아래 이미지 참고)
qt raspberry pi용 kits설정

Divces로 이동하여 Add버튼을 클릭하여 Generic Linux Device를 선택합니다.
원격 실행 설정1

아래 이미지처럼 필요한 정보들을 입력하고 다음으로 넘어갑니다.
원격 실행 설정2

Create New Key Pair버튼을 클릭하고 SSH Key Configuration에 private key file, public key file을 설정후 Generate And Save Key Pair버튼을 선택합니다.
원격 실행 설정3

그 후 Deploy Public Key버튼을 눌러 ssh login을 위한 password 인증을 합니다.
인증 후 설정을 마칩니다.
원격 실행 설정4
원격 실행 설정5
원격 실행 설정6
원격 실행 설정7

설정이 완료되었으면 프로젝트를 새로하나 만들고 profile에 target.path를 /home/posa20000으로 변경합니다.(아래 이미지 참고)
실행파일 경로 설정

Qt에 이 명령을 추가합니다. - Platform linuxfb:fb="/dev/fb0"
실행시 arguments 옵션 설정
자 이제 빌드하고 실행해봅니다.

엇 실행했더니 실행은되지만 아래 이미지처럼 warning이 발생하고 타겟인 라즈베리파이에는 버튼에 글씨가 보이지 않는다.
실행 시 font warning발생
라즈베리파이에서 text가 안보임
warning에는 font관련 폴더를 찾을 수 없다라고 되어있다.
https://dejavu-fonts.github.io 들어가서 dejavu-fonts를 다운받아 압축을 풉니다.
windows에서 압축푼 dejavu-fonts
그리고 타겟인 라즈베리파이에서 /usr/local/Qt-5.12.x/lib에 들어가 fonts폴더를 생성합니다.
라즈베리파이에 fonts폴더 생성

winscp를 사용하여 다운받은 dejavu-fonts-ttf\ttf안에 있는 파일들을 /usr/local/Qt-5.12.x/lib/fonts로 복사합니다.
dejavu-fonts 라즈베리파이로 복사
그 이후 다시 Qt Creator에서 실행합니다.
warning은 제거되고 화면에 text가 표기되는게 보입니다.
정상화면

마지막으로 debug를 해보겠습니다.
앗 아래 이미지처럼 메시지가 발생하네요.
debug 오류
해결방법은
https://download.qt.io/development_releases/prebuilt/gdb/windows-7들어가 gdb를 설치하고 압축해제합니다.
압축해제한 gdb

Qt creator options에서 debuggers에서 압축푼 gdb 추가합니다.
debuggers option 설정
path 추가
gdb-arm-none-linux-gnueabi.exe로 설정해줍니다.
gdb-arm-none-linux-gnueabi.exe로 설정하기
설정 완료하였다면 아래이미지처럼 kits탭으로 이동하여 Debugger를 설정해줍니다.
debugger설정
그리고 타겟인 라즈베리파이에 접속하여 sudo apt-get install gdbserver 명령어를 실행합니다.
gdbserver 설치 명령어
gdbserver 설치가 완료되었다면 다시 debug를 진행해봅니다.
debug 성공
정상적으로 debug가 되었습니다.

profile
안녕하세요 QT,QML 개발자입니다.

1개의 댓글

comment-user-thumbnail
5일 전

선생님 글 정말 잘 읽었습니다. 혹시 make 하실 때 다른 오류는 없으셨나요?? 저는 python을 2.7.5로 설치하고, msys 환경변수도 넣었는데.. python --version을 입력해도 version 2.7.5가 나오지만, make하면 warring 뜨더라구요..

답글 달기