Qt 4.8.7 CROSS_COMPILE

SMJ·2026년 1월 29일

BSP development

목록 보기
15/17

과정 요약

  1. 개발 환경 (호스트 PC) : Ubuntu PC에서 MA35D1 보드용으로 configure, make 명령어를 통해 qt 라이브러리와 애플리케이션 빌드
  2. 실행 환경 (타겟 보드) : 컴파일된 파일들을 MA35D1 보드에 옮김
  3. 최종 목표 : MA35D1 보드에서 Qt 애플리케이션을 실행하여 의도대로 동작하는 지 확인
  4. 보드(64비트 아키텍쳐) - QT4.8.7 (32비트 아키텍쳐)

준수 사항

  • Tslib경로를 Qt의 QMAKE_INCDIR 및 QMAKE_LIBDIR에 명시해줘야함
  • Qt -> qmake.conf 파일에서 tslib 관련 쉘스크립트 추가 및 configure 옵션에서 tslib 관련 설정

로드 과정

  1. Qt4 설치 및 압축풀기
$ wget https://download.qt.io/archive/qt/4.8/4.8.7/qt-everywhere-opensource-src-4.8.7.tar.gz
$ tar -xvf qt-everywhere-opensource-src-qt-4.8.7.tar.gz
$ cd qt-everywhere-opensource-src-4.8.7
  1. Qmake.conf 수정 및 생성
  • ~/qt-everywhere-opensource-src-4.8.7/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf 설정
    (32bit ARM Cross_Compile 기준)
  • -none- 이라고 되어있는 부분 삭제
  • add 부분 추가 (QMAKE_INCDIR, QMAKE_LIBDIR)
  1. Qt4 Build
$ mkdir output

# Qmake.conf에서 지정한 TSLIB_OUTPUT 경로 설정
$ export TSLIB_OUTPUT=${PWD}/../tslib/output
./configure \
--prefix=${PWD}/output \
-embedded arm \   #타겟 arm 32비트
-xplatform qws/linux-arm-gnueabi-g++ \ #타겟 아키텍쳐 설정
-little-endian \
-opensource \ 
-host-little-endian \
-confirm-license \
# 터치, 화면회전, 키보드 입력 플러그인 활성화
-qt-mouse-tslib \
-qt-gfx-linuxfb \
-qt-kbd-linuxinput
-no-openssl   #보안이 필요한 네트워크 기능 비활성화

$ make
$ make install
#Target ARM 32bit
  1. SD카드 media에 Qt4 라이브러리 복사
  • copy 하기전에 /opt/tslib 및 /opt/qt-4.8.7 생성
$ sudo cp -rfvp /home/smjeon/MA35D1/qt-everywhere-opensource-src-4.8.7/output/ /media/smjeon/2e7f71fb-0a4c-4e79-9210-75131d081582/opt/qt-4.8.7/
$ sudo cp -rfvp /home/smjeon/MA35D1/tslib/output/ /media/smjeon/2e7f71fb-0a4c-4e79-9210-75131d081582/opt/tslib_1.22/

보드(MA35D1)에서 실행

  1. tslib test

    # 터치 라이브러리 보정
    ts_calibrate
    
    # 터치 테스트
    ts_test
  2. ld-linux.so.3

# demo 실행
$ cd /opt/qt-4.8.7/output/demos/affine
$ ./affine -qws
    
-sh: ./affine: No such file or directory
    
# ./affine interpreter 확인
$ file ./affine
    
./affine: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, **interpreter /lib/ld-linux.so.3**, for GNU/Linux 3.2.0, BuildID[sha1]=..., stripped
    
# interpreter를 통해 ld-linux.so.3 파일이 /lib/ 디렉토리에 존재하지 않기 때문에 오류가 뜨는 것으로 확인
  1. tslib.sh 쉘스크립트 작성 /etc/profile.d/tslib.sh
# QTDIR, TSLIB_OUTPUT 경로 지정
export QTDIR=/opt/qt-4.8.7/output
export TSLIB_OUTPUT=/opt/tslib_1.22/output
    
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_OUTPUT/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=$QTDIR/plugins
    
# input_device touchscreen0 -> event0 이므로 event0으로 설정
export QWS_MOUSE_PROTO='Tslib:/dev/input/event0'
    
# TSLIB Setting
export TSLIB_TSDEVICE=/dev/input/event0  # /dev/input/ 에서 touchscreen이 어디로 받고 있는 지 확인
export TSLIB_CALIBFILE=/etc/pointercal   # ts_calibrate를 실행시켜야 생성
export TSLIB_CONFFILE=$TSLIB_OUTPUT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_OUTPUT/lib/ts
  • 작성 후 source ./tslib.sh 해서 쉘스크립트 불러오기
  1. 해당파일 SCP 프로토콜 이용해 보드로 복사 (ubuntu 16.04 → MA35D1)
  • Ubuntu에서 실행
# scp <로컬_파일경로> <사용자명>@<보드_IP>:<보드_저장경로>
        
# ld-linux.so.3 -> /lib/ 디렉토리에 옮기기
$ scp /usr/arm-linux-gnueabi/lib/<file명> root@192.168.0.249:/lib/
        
 # 그 외 파일 옮기기
$ scp /usr/arm-linux0gnueabi/lib/<file명> root@192.168.0.249:/opt/qt-4.8.7/output/lib
  • ./affine -qws 실행 후 없는 파일 scp로 해당 디렉토리에 넣기
  • error while loading shared libraries <파일명>: wrong ELF class:ELEFCLASS64
  • libstdc++.so.6
  • libgcc_s.so.1
  • libc.so.6
  • libpthread.so.0
  • libm.so.6
  • libdl.so.2
  • librt.so.1
  • liberty
      

최종결론

  • Qt4.8.7의 경우 arm 32비트용으로 크로스 컴파일 후 맞지 않는 환경변수 및 라이브러리는 ARM 32비트 라이브러리 복사 후 파일 넣고 export로 Qt 및 Tslib 라이브러리 디렉토리를 가리킴
  • 예제파일의 경우는 동작하였으나 32비트용 ARM으로 크로스컴파일 후 MA35D1 보드에 넣으면 호환성 에러가 발생 (sysroot 부재 및 크로스컴파일 호환성 에러로 의심 됌)

시행착오 끝에 내린 결론은 위와 같은 방식으로 하는 것은 권장되지 않고 보드 SDK로 해당 sysroot를 정확히 맞추어 CROSS_COMPILE해야 호환성 에러가 발생할 확률이 줄어듬

profile
Embedded Junior Developer

0개의 댓글