Qt 5.12.12 Arm 타겟 빌드 (Win32 호스트)

참조사항

Qt 버전별 툴체인 권장버전: https://wiki.qt.io/MinGW
MinGW-w64의 스레드 모델, 예외 처리 모델의 자세한 내용: http://blog.tcltk.co.kr/?p=3836

필요환경

Perl: https://strawberryperl.com/releases.html
Python: https://www.python.org/downloads/
MinGW: https://sourceforge.net/projects/mingw-w64/files/
GCC (Raspberry Pi): https://gnutoolchains.com/raspberry/

Perl이나 Python이 이미 시스템에 설치되어 있다면 환경변수에 경로가 설정되어 있는지 확인하여 그대로 사용하면 되며, 시스템에 설치하지 않고 Qt 빌드에 잠깐 사용을 원한다면 Perl은 Portable Edition, Python 3는 Embeddable Package로 받으면 된다.

이 글에서 압축을 푸는 위치는 D:\OpenSource를 기준으로 한다. 단 Python은 압축 파일 내 폴더없이 압축되어 있으므로 압축 해제 시 ‘여기에 압축 풀기’가 아닌 ‘python-3.9.9-embed-amd64에 압축풀기’와 같은 방법으로 해제한다.

환경변수

set PATH=D:\OpenSource\mingw64\bin;D:\OpenSource\strawberry-perl-5.32.1.1-64bit-portable\perl\bin;D:\OpenSource\python-3.9.9-embed-amd64;%PATH%

Perl 5.32.1.1 64bit Portable Edition, Python 3.9.9 Embeddable Package, MinGW 는 참조사항의 링크 내용을 따라서 버전을 선택하면 되며 현재 글에서 사용한 컴파일러 posix보다는 더 나은 퍼포먼스를 위해 x86_64-win32-seh 사용, GCC (Raspberry Pi)는 대상 OS에 맞는 버전으로 사용.

참고: 윈 10 최근 버전은 python 명령이 스토어에 연결된 단축 명령 형식으로 재공되므로 원하지 않는 오류가 발생할 수 있다. 이러한 경우가 발생하는것을 원하지 않는다면 시작 – 설정 실행, 앱 항목에서 ‘앱 및 기능’ 레이블의 하단 ‘앱 실행 별칭’ 링크로 이동하여 ‘앱 설치 관리자’항목으로 지정된 python.exe와 python3.exe 항목을 ‘끔’으로 변경하면 별칭과의 충돌을 피할 수 있다.

빌드설정

..\qt-everywhere-src-5.12.12\configure -opensource -confirm-license -platform win32-g++ -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=C:\SysGCC\raspberry\bin\arm-linux-gnueabihf- -sysroot C:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot -prefix /opt/Qt5.12.12 -extprefix D:\OpenSource\Qt5.12.12.gcc-arm -hostprefix D:\OpenSource\Qt5.12.12.gcc-arm -release -eglfs -opengl es2 -no-use-gold-linker -nomake examples -nomake tests -skip qtscript

shadow 빌드를 기준으로 한다. (설정이 잘못되거나 처음부터 다시 빌드해야 할 경우 빌드 폴더를 지우고 다시 폴더를 만들어서 진행하면 make distclean보다 훨씬 깔끔하게 다시 빌드할 수 있기때문이다.)

Qt 소스경로: D:\OpenSource\qt-everywhere-src-5.12
Qt빌드경로: D:\OpenSource\Qt5.12.12.gcc-arm.build
Qt설치경로: D:\OpenSource\Qt5.12.12.gcc-arm

gold 링커가 더 성능 좋다고하지만 MinGW 쉘 환경이 아니라면 링커가 실행되지 않으므로 -no-use-gold-linker 옵션을 추가, device 값은 linux-rasp-pi3-vc4-g++도 있으나 손봐야 하는 환경도 있고 타겟 보드에 Qt를 빌드하여 넣는 것이 아닌 윈도에서 타겟 보드에서 실행할 프로그램을 크로스 빌드 하기위한 Qt 이므로 별 의미 없다.

examples는 필요한 예제를 나중에 따로 빌드해도 되고 꽤나 시간을 많이 잡아먹기때문에 nomake 처리하였고, 크로스 빌드에선 tests를 빌드하는지 모르겠지만 테스트도 보통 시간을 많이 잡아먹기 때문에 일단 nomake에 추가.

sysroot 옵션은 VideoCore의 그래픽 가속 라이브러리 링크를 위해서이다. 이 옵션이 없으면 OpenGL ES 인터페이스가 비활성화된다. X Window를 사용하지않고 eglfs를 사용한다면 필수.

sysroot 옵션을 지정할 경우 install 경로가 $sysroot/$prefix 으로 되므로 prefix는 임의로 /opt/Qt5.12.12 로 지정하였다. 실제 설치위치는 extprefix와 hostprefix로 지정한다. (extprefix는 라이브러리, hostprefix는 qmake등 호스트 레벨의 실행파일의 설치 위치)

device 옵션으로 pi3를 지정하면 이곳의 글 6번 항목 내용처럼 qtscript 모듈에서 빌드 오류가 뜬다. 쓰지않으니 skip 처리하였다.

빌드 및 바이너리 설치

아래와같이 명령어를 입력하면 된다. j옵션의 숫자는 CPU 스레드 수 또는 +1 정도면 적당하다.

mingw32-make -j6
mingw32-make install

DLL 복사

G++로 빌드된 바이너리는 libstdc++이 필요하다. 해당 런타임은 D:\OpenSource\mingw64\bin 폴더에서 libgcc_s_seh-1.dll, libstdc++-6.dll 두 파일을 D:\OpenSource\Qt5.12.12.gcc-arm\bin에 복사하면 된다. posix 모델을 사용하는 MinGW를 사용하였으면 libwinpthread-1.dll 파일도 필요할것으로 보인다.

경우에 따라서 positing 모듈에서 오류가 발생 할 경우 이곳을 참고. 링크 실패하는 종속성은 clip2tri, poly2tri, clipper, qmapboxgl 네가지이며 아래와같이 입력하여 직접 빌드하고 Qt를 빌드하면 된다. 다른 모듈에서도 3rdparty 라이브러리에서 오류가 발생하면 동일한 방법으로 해결 가능하다.

set WORK=%CD%
cd qtlocation\src\3rdparty\clip2tri
mingw32-make
cd %WORK%
cd qtlocation\src\3rdparty\clipper
mingw32-make
cd %WORK%
cd qtlocation\src\3rdparty\poly2tri
mingw32-make
cd %WORK%
cd qtlocation\src\3rdparty\mapbox-gl-native
mingw32-make
cd %WORK%
rem Qt를 이어서 빌드
mingw32-make -j6

기타

MinGW-w64의 스레드 모델, 예외 처리 모델 링크에 첨부된 파일

rasbian에서는 libEGL.so와 libGLESv2.so는 SONAME의 값에의해 각각 libEGL.so.1 ,libGLESv2.so.2로 링크된다. buildroot의 rpi-userland는 libEGL.so와 libGLESv2.so로 생성되고 버전 넘버링된 링크가 없기때문에 타겟 시스템에 링크를 생성하거나 타겟 시스템에서 libEGL.so, libGLESv2.so 파일을 raspberry의 SysGCC의 arm-linux-gnueabihf\sysroot\lib\arm-linux-gnueabihf와 arm-linux-gnueabihf\sysroot\usr\lib\arm-linux-gnueabihf에 덮어써야한다. (buildroot 2021 기준으로 libkhrn_client.so, libvchostif.so도 함께 복사해야 했다.) 버전 넘버링 된 shared object파일은 SysGCC에서 링크로 생성하기 때문에 그냥 두어도 된다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

*
*

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.