Qt 환경 배포 - 우분투

댓글 0개

Qt 환경이란?

Qt는 고성능 데스크탑, 모바일 및 웹 애플리케이션을 구축할 수 있는 크로스 플랫폼 C++ 그래픽 사용자 인터페이스 애플리케이션 개발 프레임워크입니다. 또한 콘솔 도구 및 서버와 같은 GUI가 없는 프로그램을 개발하는 데에도 사용할 수 있습니다. Qt는 특별한 코드 생성 확장과 일부 매크로를 사용하는 객체 지향 프레임워크입니다. Qt는 확장이 쉽고 진정한 컴포넌트 기반 프로그래밍을 허용합니다.

Qt는 높은 모듈성, 재사용성, 빠른 학습 곡선 덕분에 인기 있는 개발 프레임워크가 되었습니다.

Ubuntu 18/20 배포

Firefly는 Firefly 제품에서 실행되는 Ubuntu 18/20 시스템용 Qt 환경 패키지를 제공하여 빠른 배포 및 개발을 실현할 수 있습니다. 두 시스템의 환경은 호환되지 않으므로 Firefly 장치에서 실행 중인 시스템 버전에 따라 해당 환경을 선택하세요.

환경 패키지가 필요하신 경우 문의해 주시기 바랍니다.

환경 패키지는 교차 컴파일 방식을 사용하여 한 플랫폼에서 다른 플랫폼용 실행 코드를 생성합니다. 우리는 x86_64 아키텍처의 Linux 컴퓨터에서 개발 및 컴파일하고, 컴파일된 실행 파일을 Arm64 아키텍처의 대상 장치에 배치하여 실행해야 합니다. 따라서 환경 패키지는 호스트와 장치 모두에 배포되어야 합니다.

참고: 환경 패키지의 버전마다 약간의 차이가 있습니다. 아래 배포 및 환경 준비 섹션에서는 하나의 예시만 설명합니다. 구체적인 사용법은 환경 패키지에 포함된 문서를 참조하세요.

호스트 측 배포

호스트 선택에 관하여: 개발에는 대상 장치와 동일한 시스템의 호스트를 사용하세요.

예를 들어, Ubuntu 20에서 실행되는 Firefly 장치용 Qt 프로그램을 개발해야 한다면, 호스트도 Ubuntu 20이 실행 중인 컴퓨터여야 합니다.

1. 배포 시작

환경 패키지를 컴퓨터에 압축 해제한 후, 압축 해제된 디렉토리로 cd 이동하여 배포를 시작합니다. 주로 3단계로 나뉩니다:

  1. # 파일을 시스템의 /opt/ 디렉토리로 복사
  2. cp -rfd firefly_qt5.15_arm64_20.04 /opt/
  3. # sysroot를 /opt/ 디렉토리로 복사
  4. cp -rfd sysroot /opt/
  5. # 환경 변수 파일을 /etc/profile.d/로 복사
  6. cp host/host_qtEnv.sh /etc/profile.d

2. 환경 준비

크로스 컴파일러를 설치합니다.

  1. sudo apt update
  2. sudo apt install -y crossbuild-essential-arm64

그런 다음 다시 로그인하거나 컴퓨터를 재부팅하여 이전에 복사한 환경 변수가 적용되도록 합니다.

3. 검증

압축 패키지에는 환경이 제대로 구축되었는지 확인할 수 있는 몇 가지 간단한 Qt 데모가 포함된 example 폴더도 함께 제공됩니다. 모든 과정이 순조롭다면 환경이 성공적으로 배포된 것입니다.

  1. # 예를 들어 analogclock으로 검증
  2. cd example/analogclock
  3. # qmake 실행하여 자동으로 컴파일 시스템 생성
  4. qmake
  5. # make 실행하여 컴파일 시작
  6. make

장치 배포

1. 배포 시작

환경 패키지를 컴퓨터에 압축 해제한 후, 압축 해제된 디렉토리로 cd 이동하여 배포를 시작합니다. 주로 2단계로 나뉩니다:

  1. # ext 부분을 시스템의 /opt/ 디렉토리로 복사합니다. ext는 firefly_qt5.15로 이름이 변경됩니다.
  2. cp -rfd firefly_qt5.15_arm64_20.04/ext /opt/firefly_qt5.15
  3. # 환경 변수 파일을 /etc/profile.d/로 복사
  4. cp target/target_qtEnv.sh /etc/profile.d/

2. 환경 준비

장치에 필요한 라이브러리도 설치해야 합니다:

  1. apt install -y libmtdev1 libinput10 libxkbcommon0 \
  2. libdouble-conversion3 libicu66 libharfbuzz0b \
  3. libwebpdemux2 libwebpmux3

"/etc/profile.d/target_qtEnv.sh" 파일을 열면 주석 처리된 세 개의 환경 변수를 볼 수 있습니다:

  1. #XCB
  2. #export QT_QPA_PLATFORM=XCB
  3. #export QT_QPA_EGLFS_INTEGRATION=XCB_EGL
  4. #LinuxFB
  5. #export QT_QPA_PLATFORM=LINUXFB
  6. #export QT_QPA_FB_DRM=1
  7. #EGLFS
  8. #export QT_QPA_PLATFORM=EGLFS
  9. #export QT_QPA_EGLFS_INTEGRATION=EGLFS_KMS #minimal ubuntu에서는 eglfs_kms 사용.
  10. A_EGLFS_KMS_ATOMIC=1 #drm atomic api 또는 legacy api 사용 (둘은 다름)
  11. #export QT_QPA_EGLFS_HIDECURSOR=1 #커서 숨기기

사용하려는 QPA_PLATFORM에 따라 해당 부분의 주석을 해제하세요. 예를 들어 Ubuntu 환경에서는 일반적으로 XCB를 사용하므로 이 부분의 주석을 해제한 후 저장하고 편집기를 종료하세요.

  1. #XCB
  2. export QT_QPA_PLATFORM=XCB
  3. export QT_QPA_EGLFS_INTEGRATION=XCB_EGL

XCB를 사용하는 경우 추가로 다음 라이브러리도 설치해야 합니다:

  1. apt install -y libxcb-icccm4 libxcb-image0 libxcb-shm0 \
  2. libxcb-keysyms1 libxcb-render0 libxcb-render-util0 \
  3. libxcb-shape0 libxcb-sync1 libxcb-xfixes0 \
  4. libxcb-xinerama0 libxcb-xkb1 libxcb-randr0 \
  5. libsm6 libice6 libxkbcommon-x11-0

마지막으로 reboot 명령어를 실행하여 장치를 재부팅하세요.

3. 검증

호스트 측에서 컴파일한 실행 파일을 장치 측으로 전송하여 실행해 보세요. 정상적으로 실행된다면 장치 측 환경 구축에 성공한 것입니다.

  1. LD_LIBRARY_PATH=/opt/firefly_qt5.15/lib ./analogclock

Ubuntu 22 배포

타겟 Firefly 장치가 Ubuntu 22를 실행 중인 경우, 크로스 컴파일 개발이 필요하지 않으며 Qt 설치가 훨씬 간단하고 편리합니다.

Firefly는 Ubuntu 22용 Qt 환경을 deb 패키지로 제작했으며, 타겟 장치에서 apt를 사용하여 설치할 수 있습니다:

  1. # 기본 환경 설치
  2. apt update
  3. apt install -y qtcreator qtbase5-dev
  • # 개발 필요에 따라 추가 Qt 구성 요소 및 개발 환경 설치, 예:
  • apt install -y libqt5multimedia5 qtmultimedia5-dev libqt5quick5 qtdeclarative5-dev
  • Qt Creator 설정

    Qt 개발은 종종 Qt Creator를 IDE로 사용합니다. 이전 단계에서 Qt 개발 환경을 설정했습니다. 다음으로 Qt Creator가 기본 내장 환경이나 다른 위치의 환경이 아닌, 우리가 구축한 환경을 사용하도록 설정하는 방법을 소개합니다.

    Ubuntu 18/20

    호스트 측에서 다음 명령어를 사용하여 Qt Creator를 빠르게 설치할 수 있습니다:

    1. sudo apt update
    2. sudo apt install qtcreator

    Qt Creator를 실행한 후 상단 메뉴에서 tools -> options를 클릭하여 설정 화면을 엽니다:

    그런 다음 Qt Versions를 선택하고 add를 클릭하여 Qt 버전을 추가합니다:

    팝업 창에서 이전에 /opt에 복사해 놓은 Qt 환경을 선택합니다:

    참고: 경로는 환경 패키지 버전에 따라 다를 수 있지만, 최종적으로 /opt 아래의 qmake 경로를 선택해야 합니다.

    새로 추가한 Qt Version에 이름을 지정한 후 apply를 클릭하여 적용합니다:

    그런 다음 Kits 페이지를 선택하고 새 Kit를 추가합니다:

    새 Kit를 다음과 같이 구성합니다:

    설정의 의미: 먼저 Kit에 이름을 지정하여 식별하기 쉽게 합니다. Device Type은 Generic Linux Device로 설정해야 합니다. 중요한 설정은 다음 세 가지입니다. Sysroot는 이전에 /opt에 복사해 놓은 sysroot를 선택하고, Compiler는 arm 64비트 GCC를 선택하며, Qt Version은 이전 단계에서 추가한 Qt Version을 선택합니다. 그런 다음 Apply를 클릭하여 변경 사항을 적용합니다.

    마지막으로 프로젝트를 열고 새로 추가한 Kit를 선택하여 컴파일합니다. 컴파일이 성공하면 설정이 올바른 것입니다:

    Ubuntu 22

    대상 장치가 Ubuntu 22 시스템인 경우 크로스 컴파일이 필요 없으므로 Qt Creator를 장치에 직접 설치합니다.

    Qt 환경이 apt를 통해 설치되었기 때문에 Qt Creator를 열면 qmake 경로를 자동으로 감지합니다:

    Qt Creator가 자동으로 감지한 qmake 경로는 /usr/lib/qt5/bin/qmake이므로 Qt Version을 수동으로 추가할 필요가 없습니다.

    Kit 설정 시 Sysroot는 설정할 필요가 없으며, Qt Version은 자동으로 감지된 Qt Version을 선택합니다. 나머지 설정은 이전 단계와 동일하게 유지하면 됩니다.

    FAQ

    1. 압축 해제 실패

    환경 패키지를 압축 해제할 때 다음 오류가 발생하는 경우:

    1. tar: xxxxx: Directory renamed before its status could be extracted
    2. tar: Exiting with failure status due to previous errors

    tar에 -P 옵션을 추가하여 다시 압축을 풀 수 있습니다. 예시:

    1. tar -Pzxf firefly_arm64_qt5.15_20.04_20230415.tgz

    2. 여러 Qt 버전 충돌

    Qt 프로그램 실행 시 Qt 라이브러리를 찾지 못하는 경우:

    1. ./analogclock: symbol lookup error: ./analogclock: undefined symbol: _ZN9QGradientD1Ev, version Qt_5

    이 오류는 Qt 프로그램이 일치하지 않는 Qt 라이브러리를 찾았다는 것을 의미합니다. 이 문제는 여러 Qt 버전 환경이 공존하는 시스템에서 자주 발생합니다. 예를 들어, 원래는 "/opt/firefly_qt5.15"의 환경이 필요하지만 Qt 프로그램이 "/lib/aarch64-linux-gnu/libQt5Gui.so.5"를 사용하려고 시도하여 문제가 발생하는 경우입니다.

    ldd 명령어를 사용하여 프로그램이 참조하는 라이브러리를 확인할 수 있습니다:

    1. root@firefly:~/analogclock# ldd analogclock | grep -i qt
    2. libQt5Gui.so.5 => /opt/firefly_qt5.15/lib/libQt5Gui.so.5 (0x0000007f8e0b2000)
    3. libQt5Core.so.5 => /opt/firefly_qt5.15/lib/libQt5Core.so.5 (0x0000007f8daf6000)

    해결 방법 1: 컴파일 전에 프로그램이 참조할 라이브러리 경로를 지정합니다. 프로젝트의 pro 파일에 다음을 추가합니다:

    1. QMAKE_RPATHDIR += /opt/firefly_qt5.15/lib

    해결 방법 2: 프로그램 실행 시 LD_LIBRARY_PATH를 지정합니다:

    1. LD_LIBRARY_PATH=/opt/firefly_qt5.15/lib ./analogclock

    3. 디스플레이를 찾을 수 없음

    Qt 프로그램 실행 시 디스플레이에 연결할 수 없는 경우:

    1. qt.qpa.xcb: could not connect to display
    2. qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
    3. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
    4. Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, webgl, xcb.
    5. Aborted

    이 경우 환경 변수 문제일 가능성이 높으며, 일반적으로 다음과 같이 지정해야 합니다:

    1. # x11 환경 사용 시:
    2. export DISPLAY=:0
    3. # wayland 환경 사용 시:
    4. export WAYLAND_DISPLAY=wayland-0

    4. Qt 라이브러리를 찾을 수 없음

    Qt 프로그램 실행 시 Qt 라이브러리를 찾지 못하는 경우:

    1. ./analogclock: error while loading shared libraries: libQt5Gui.so.5: cannot open shared object file: No such file or directory

    "/etc/profile.d/target_qtEnv.sh" 환경 변수 파일이 존재하는지 확인하세요. 존재한다면, 해당 파일이 적용되었는지 확인하세요. 문서에서 요구하는 대로 Qt 라이브러리 경로가 올바른 위치에 배치되었는지도 확인하세요.


    Firefly 기술 사례 - Docker에서의 안드로이드

    댓글 남기기

    댓글 게시 전에는 반드시 승인이 필요합니다.