天天看點

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

文章目錄

  • 前言
  • 一、Qt是什麼?
  • 二、開發部署環境
  • 三、部署Qt5.12.2交叉編譯環境
    • 3.1 安裝前的相關包下載下傳及環境準備
    • 3.2 在開發闆端部署Qt5.12.2交叉編譯環境
    • 3.3 在PC端部署Qt5.12.2交叉編譯環境
      • 3.3.1 安裝交叉編譯工具
      • 3.3.2 配置Qt交叉編譯環境
      • 3.3.3 安裝配置Qt Creator 4.8.6
  • 總結

前言

實驗室所用的AIO-3399ProC開發闆,做項目需要用到Qt軟體設計GUI界面和Qt的多線程并行化功能,故在開發闆端和PC端部署Qt5.12.2交叉編譯環境。本文記錄了部署Firefly官方釋出的Qt交叉編譯工具鍊時的過程、遇到的問題及解決方案,以供本人和各位參考。

一、Qt是什麼?

Qt 是一個1991年由Qt Company開發的跨平台C++圖形使用者界面應用程式開發架構。它既可以開發GUI程式,也可用于開發非GUI程式,比如控制台工具和伺服器。Qt是面向對象的架構,使用特殊的代碼生成擴充(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴充,并且允許真正地元件程式設計。

優良的跨平台特性:

Qt支援下述平台:

MS/Windows - 95、98、NT4.0、ME、2000、XP 、 Vista、Win7、win8、win2008、win10

Unix/X11 -Linux、SunSolaris、HP-UX、CompaqTru64 UNIX、IBMAIX、SGI IRIX、FreeBSD、BSD/OS和其它很多X11平台

Macintosh -Mac OS X

Embedded - 有幀緩沖(framebuffer)支援的嵌入式Linux平台,Windows CE、Symbian、Symbian^3、Symbian Anna、Symbian Belle、MeeGo、haiku-os。

面向對象:

Qt 的良好封裝機制使得 Qt 的子產品化程度非常高,可重用性較好,對于使用者開發來說是非常友善的。 Qt 提供了一種稱為 signals/slots 的安全類型來替代 callback,這使得各個元件之間的協同工作變得十分簡單。

豐富的 API:

Qt 包括多達 250 個以上的 C++ 類,還提供基于模闆的 collections, serialization, file, I/O device, directory management, date/time 類。甚至還包括正規表達式的處理功能。

支援 2D/3D 圖形渲染,支援 OpenGL

大量的開發文檔

支援XML。

注:本節内容引用自Qt百度百科

二、開發部署環境

開發環境 軟體版本/配置
開發闆型号 Firefly AIO-3399 ProC開發闆 (3+16GB)
開發闆作業系統 Ubuntu 18.04LTS
開發闆固件版本 AIO-RK3399PROC-UBUNTU18.04-GPT-20200525-1016.img
PC系統版本 Ubuntu 18.04LTS
Qt版本 5.12.2
Qt Creator版本 4.8.2
Qt交叉編譯工具包 firefly_arm64_qt5.12.2_18.04_20210226.tgz
電腦遠端軟體 Xshell 6&Xftpd 6

三、部署Qt5.12.2交叉編譯環境

3.1 安裝前的相關包下載下傳及環境準備

  • Qt交叉編譯工具環境準備

Firefly釋出的Qt交叉編譯工具鍊,适用于以下環境:

Host(PC端): x86-64 / Ubuntu 18.04

Target(開發闆端): Firefly RK3399Pro / RK3399 / RK3328 PX30 / Ubuntu 18.04 Minimal&Desktop

工具鍊完整支援wenEngine, 支援EGLFS LinuxFB XCB 等backend。

下載下傳位址:https://pan.baidu.com/s/1tNGqG4XSYuDxe_AdDegOAA

提取碼:FFQT

Qt Creator內建開發環境包在此連結下載下傳qt-opensource-linux-x64-5.12.2.run這個檔案,如下圖紅框所示處:

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結
  • PC端交叉編譯工具下載下傳

    PC端需要手動安裝交叉編譯工具aarch64-linux-gnu-gcc,該工具是由 Linaro 公司基于GCC推出的的ARM交叉編譯工具,可用于交叉編譯ARMv8 64位目标中的裸機程式、u-boot、Linux kernel、filesystem和App應用程式。aarch64-linux-gnu-gcc交叉編譯器必須安裝在64位主機上,才能編譯目标代碼。不能使用傳統的arm-linux-交叉編譯工具鍊,那些編譯出來的都是32bit。

    最新7.5.0版本的下載下傳位址,在該頁面下載下傳gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz檔案,如下圖紅框所示處:

    Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

    也可在官網上下載下傳以前的版本 下載下傳位址

    (注:按照Firefly官方Qt5.12.2_Release.md檔案中的提示方法:

    sudo apt install -y crossbuild-essential-arm64

    安裝交叉編譯工具時,由于找不到aarch64-linux-gnu-gcc 和aarch64-linux-gnu-g++檔案的路徑,導緻無法在Qt Creator中進行環境配置,是以不使用該方法安裝交叉編譯工具。)

3.2 在開發闆端部署Qt5.12.2交叉編譯環境

首先将下載下傳好的firefly_arm64_qt5.12.2_18.04_20210226.tgz包通過XFtpd軟體或者U盤複制到開發闆的任意路徑(本文将檔案複制到了/home/firefly/路徑)下。在指令行中執行以下操作:

#解壓.tar檔案
sudo tar zxvf firefly_arm64_qt5.12.2_18.04_20210226.tgz
cd ./firefly_arm64_qt5.12.2_18.04_20210226
#複制檔案夾及其下所有檔案到指定路徑
sudo cp -rfd host/opt/firefly_qt5.12.2_arm64_18.04/ext  /opt/firefly_qt5.12.2
#配置qt的環境變量
sudo cp target/qtEnv.sh /etc/profile.d/
#添加qt動态庫加載路徑
sudo cp target/qt.conf /etc/ld.so.conf.d
#重新開機開發闆使其生效
sudo reboot

           

等待開發闆系統重新開機後,執行以下操作:

#安裝基礎依賴環境
sudo apt install -y libgles2
sudo apt install -y libmtdev1 libinput10 libxkbcommon0 libdouble-conversion1 libicu60 libharfbuzz0b
#桌面環境選擇xcb顯示驅動 (Ubuntu Desktop)
sudo apt install -y \
      libxcb-icccm4 \
      libxcb-image0 \
      libxcb-shm0 \
      libxcb-keysyms1 \
      libxcb-render0 \
      libxcb-render-util0  \
      libxcb-shape0 \
      libxcb-sync1 \
      libxcb-xfixes0 \
      libxcb-xinerama0 \
      libxcb-xkb1 \
      libxcb-randr0 \
      libsm6 \
      libice6 \
      libxkbcommon-x11-0
 export QT_QPA_PLATFORM=xcb  
#重新開機使環境變量生效
 source ~/.bashrc
 sudo reboot   
 
           

至此開發闆端Qt交叉編譯環境搭建完成。

3.3 在PC端部署Qt5.12.2交叉編譯環境

3.3.1 安裝交叉編譯工具

将3.1節中下載下傳好的gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz包複制到PC端Ubuntu系統的任意路徑,執行下列指令安裝交叉編譯工具:

#将交叉編譯工具包解壓到/opt/檔案夾下
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz /opt/
#将交叉編譯工具檔案路徑添加至環境變量
sudo vim /etc/profile
#在該檔案末添加以下内容,esc後輸入:wq退出即可
...
export PATH="/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH" 
...
#重新開機使環境變量生效
 source etc/profile
 sudo reboot 
   
           

安裝完成後執行以下指令驗證是否安裝成功

[email protected]:~$ aarch64-linux-gnu-gcc -v
使用内建 specs。
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.5.0/lto-wrapper
目标:aarch64-linux-gnu
配置為:'/home/tcwg-buildslave/workspace/tcwg-make-release_0/snapshots/gcc.git~linaro-7.5-2019.12/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu
線程模型:posix
gcc 版本 7.5.0 (Linaro GCC 7.5-2019.12)

[email protected]:~$ aarch64-linux-gnu-g++ -v
使用内建 specs。
COLLECT_GCC=aarch64-linux-gnu-g++
COLLECT_LTO_WRAPPER=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.5.0/lto-wrapper
目标:aarch64-linux-gnu
配置為:'/home/tcwg-buildslave/workspace/tcwg-make-release_0/snapshots/gcc.git~linaro-7.5-2019.12/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu
線程模型:posix
gcc 版本 7.5.0 (Linaro GCC 7.5-2019.12) 
           

若列印出上列資訊,表示交叉編譯工具安裝成功。

3.3.2 配置Qt交叉編譯環境

将3.1節中下載下傳好的firefly_arm64_qt5.12.2_18.04_20210226.tgz包複制到PC端任意路徑下,在指令行中執行以下操作:

#解壓.taz檔案
sudo tar zxvf firefly_arm64_qt5.12.2_18.04_20210226.tgz
cd ./firefly_arm64_qt5.12.2_18.04_20210226
sudo cp -rfd host/opt/*  /opt/
#重新開機使環境變量生效
sudo cp host/qtEnv.sh  /etc/profile.d/
sudo reboot

           

待PC端重新開機成功後,進入/firefly_arm64_qt5.12.2_18.04/example路徑下,

執行以下指令測試是否可成功編譯

[email protected]:~/firefly_arm64_qt5.12.2_18.04/example/openglwindow$ qmake
Info: creating stash file /home/user/firefly_arm64_qt5.12.2_18.04_20200721/firefly_arm64_qt5.12.2_18.04/example/openglwindow/.qmake.stash

[email protected]:~/firefly_arm64_qt5.12.2_18.04/example/openglwindow$ make
aarch64-linux-gnu-g++ -c -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -O2 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I. -I. -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -o openglwindow.o openglwindow.cpp
aarch64-linux-gnu-g++ -c -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -O2 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I. -I. -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -o main.o main.cpp
aarch64-linux-gnu-g++ -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -O2 -Wall -W -dM -E -o moc_predefs.h /opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/features/data/dummy.cpp
/opt/firefly_qt5.12.2_arm64_18.04/host/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB --include /home/user/firefly_arm64_qt5.12.2_18.04_20200721/firefly_arm64_qt5.12.2_18.04/example/openglwindow/moc_predefs.h -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -I/home/user/firefly_arm64_qt5.12.2_18.04_20200721/firefly_arm64_qt5.12.2_18.04/example/openglwindow -I/home/user/firefly_arm64_qt5.12.2_18.04_20200721/firefly_arm64_qt5.12.2_18.04/example/openglwindow -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0 -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/aarch64-linux-gnu -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/backward -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.5.0/include -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.5.0/include-fixed -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include -I/opt/sysroot/firefly-arm64-sysroot-18.04/usr/local/include -I/opt/sysroot/firefly-arm64-sysroot-18.04/usr/include/aarch64-linux-gnu -I/opt/sysroot/firefly-arm64-sysroot-18.04/usr/include openglwindow.h -o moc_openglwindow.cpp
aarch64-linux-gnu-g++ -c -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -O2 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I. -I. -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -o moc_openglwindow.o moc_openglwindow.cpp
aarch64-linux-gnu-g++ --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -Wl,-O1 -Wl,-rpath-link,/opt/sysroot/firefly-arm64-sysroot-18.04/usr/lib/aarch64-linux-gnu -Wl,-rpath-link,/opt/sysroot/firefly-arm64-sysroot-18.04/lib/aarch64-linux-gnu -o openglwindow openglwindow.o main.o moc_openglwindow.o   -L/opt/firefly_qt5.12.2_arm64_18.04/ext/lib -lQt5Gui -lQt5Core /opt/sysroot/firefly-arm64-sysroot-18.04/usr/lib/aarch64-linux-gnu/libGLESv2.so -lpthread   

ls ./openglwindow 
main.cpp  main.o  Makefile  moc_openglwindow.cpp  moc_openglwindow.o  moc_predefs.h  openglwindow  openglwindow.cpp  openglwindow.h  openglwindow.o  openglwindow.pri  openglwindow.pro

           

可知/example/對應路徑下生成可在開發闆上執行的檔案,将檔案通過Xftpd或U盤複制到開發闆任意路徑下,執行./例子名稱 檔案,即可出現圖形界面,如下圖所示:

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

由此可在PC端的Qt交叉編譯庫可以正常使用。

3.3.3 安裝配置Qt Creator 4.8.6

  1. 安裝Qt Creator

    将3.1 節下載下傳好的qt-opensource-linux-x64-5.12.2.run檔案複制到PC端的任意路徑下,執行以下指令安裝:

#更改檔案的通路權限
sudo chmod u+x qt-opensource-linux-x64-5.12.2.run
#運作檔案進行Qt Creator的安裝
./qt-opensource-linux-x64-5.12.2.run

           

在出現的圖形界面中登入Qt賬号後點下一步,

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

沒有Qt賬号的可以注冊一下或者斷網後跳過登入這步。

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

安裝到預設路徑,在選擇元件時,隻勾選安裝Developer and Designer Tools即可,然後執行下一步等待安裝完成。

  1. 運作Qt Creator
#進入Qt Creator安裝路徑
cd /opt/Qt5.12.2/Tools/QtCreator/bin
sudo ./qtcreator.sh

           

即可運作Qt Creator。

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結
  1. 配置Qt Creator交叉編譯環境

點選Qt Creator菜單欄中的工具→選項

在Kits中的QtVersion中手動設定添加Qt的qmake所在路徑,如下圖紅框處:

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

點選Apply應用生效。

在編譯器選項添加交叉編譯工具的aarch64-linux-gnu-gcc和aarch64-linux-gnu-g++檔案路徑,如下圖紅框處所示:

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結
Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

本文gcc和g++檔案所在路徑分别為:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

在建構套件選項的手動設定中添加ARM,配置裝置類型、編譯器、Qt版本等參數,修改的地方如下圖紅框處所示:

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

點選OK按鈕完成環境配置。

  1. 建立項目測試在Qt Creator中編譯的檔案能否在開發闆上運作

    ctrl+N 建立項目,在點選下圖紅框處,建立 Qt Widgets Application,Choose後進入編輯頁面。

    Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結
    在項目中的Forms檔案夾下打開mainwindow.ui檔案,進入設計頁面。
    Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結
    拖動按鈕,設計個簡單的GUI界面
    Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結
    在軟體下欄打開4.編譯輸出,在左下欄的Debug圖示上點Debug,然後點錘子圖示建構項目,需要點的地方如下圖紅框處所示:
    Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結
    編譯輸出視窗列印以下日志:
/opt/firefly_qt5.12.2_arm64_18.04/host/bin/uic ../test/mainwindow.ui -o ui_mainwindow.h
aarch64-linux-gnu-g++ -c -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../test -I. -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtWidgets -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I. -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -o main.o ../test/main.cpp
aarch64-linux-gnu-g++ -c -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../test -I. -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtWidgets -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I. -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -o mainwindow.o ../test/mainwindow.cpp
aarch64-linux-gnu-g++ -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -g -std=gnu++11 -Wall -W -dM -E -o moc_predefs.h /opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/features/data/dummy.cpp
/opt/firefly_qt5.12.2_arm64_18.04/host/bin/moc -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB --include /home/user/build-test-ARM-Debug/moc_predefs.h -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -I/home/user/test -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtWidgets -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0 -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/aarch64-linux-gnu -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.5.0/backward -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.5.0/include -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.5.0/include-fixed -I/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include -I/opt/sysroot/firefly-arm64-sysroot-18.04/usr/local/include -I/opt/sysroot/firefly-arm64-sysroot-18.04/usr/include/aarch64-linux-gnu -I/opt/sysroot/firefly-arm64-sysroot-18.04/usr/include ../test/mainwindow.h -o moc_mainwindow.cpp
aarch64-linux-gnu-g++ -c -pipe -march=armv8-a -mtune=cortex-a72.cortex-a53 --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../test -I. -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtWidgets -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtGui -I/opt/firefly_qt5.12.2_arm64_18.04/ext/include/QtCore -I. -I. -I/opt/firefly_qt5.12.2_arm64_18.04/host/mkspecs/devices/linux-firefly-rk3399-g++ -o moc_mainwindow.o moc_mainwindow.cpp
aarch64-linux-gnu-g++ --sysroot=/opt/sysroot/firefly-arm64-sysroot-18.04 -Wl,-rpath-link,/opt/sysroot/firefly-arm64-sysroot-18.04/usr/lib/aarch64-linux-gnu -Wl,-rpath-link,/opt/sysroot/firefly-arm64-sysroot-18.04/lib/aarch64-linux-gnu -o test main.o mainwindow.o moc_mainwindow.o   -L/opt/firefly_qt5.12.2_arm64_18.04/ext/lib -lQt5Widgets -lQt5Gui -lQt5Core /opt/sysroot/firefly-arm64-sysroot-18.04/usr/lib/aarch64-linux-gnu/libGLESv2.so -lpthread   
17:31:35: 程序"/usr/bin/make"正常退出。
17:31:35: Elapsed time: 00:02.
           

如果編譯成功,項目所在檔案夾下會生成可執行檔案,修改該檔案的通路權限

sudo chmod 777 ./檔案名稱

,通過Xftpd軟體或U盤複制到開發闆任意路徑下,經測試,執行後開發闆上出現圖形界面,則表示PC端編譯的Qt程式可以在開發闆上運作,如下圖所示:

Firefly AIO-3399ProC開發闆與PC端部署Qt5.12.2交叉編譯環境前言一、Qt是什麼?二、開發部署環境三、部署Qt5.12.2交叉編譯環境總結

至此PC端的Qt 及Qt Creator交叉編譯環境配置完成。

3.4 本文主要參考的文章

《RK3399 ARM QT開發環境搭建》

《Ubuntu18.04交叉編譯OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)》

《Ubuntu18.04交叉編譯OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(二)》

《Ubuntu18.04交叉編譯OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399 (三)》

《交叉編譯 QT5.12.2》

《QT5.12.1 ARM開發環境搭建 并 移植到RK3399 ubuntu16.04系統運作【完整版》】

《Firefly Ubuntu 使用手冊》

附上Firefly官方給出的Qt5.12.2_Release.md安裝檔案内容

# Qt 5.12.2 arm64 ubuntu18.04 Cross Compile

Firefly Qt5.12.2 ,Work Environment

*   Host(x86 PC)  : ubuntu 18.04 x86_64

*   Target(RK3399, RK3328, PX30): ubuntu 18.04 arm64

## Host Deployment
$ apt install -y crossbuild-essential-arm64
$ cd firfly_arm64_qt5.12.2_18.04
$ mkdir -p /opt
$ cp -rfd host/opt/*  /opt/
$ cp host/qtEnv.sh  /etc/profile.d/
reboot

# Target Deployment
$ cd firfly_arm64_qt5.12.2_18.04
$ cp -rfd host/opt/firefly_qt5.12.2_arm64_18.04/ext  /opt/firefly_qt5.12.2
$ cp target/qtEnv.sh /etc/profile.d/
$ cp target/qt.conf /etc/ld.so.conf.d
$ ldconfig
$ reboot

$ [ -e /usr/lib/aarch64-linux-gnu/libGLESv2.so.2.0.0 ] || apt install -y libgles2

# Install base library
$ apt install -y \
      libmtdev1 \
      libinput10 \
      libxkbcommon0 \ 
      libdouble-conversion1 \
      libicu60 \
      libharfbuzz0b

#Qt QPA Backends
# linuxfb
$ export QT_QPA_PLATFORM=LINUXFB
$ export QT_QPA_FB_DRM=1
$ demo/analogclock

#eglfs
$ export QT_QPA_PLATFORM=EGLFS
$ export QT_QPA_EGLFS_INTEGRATION=EGLFS_KMS #in minimal ubuntu, use eglfs_kms.
$ export QT_QPA_EGLFS_KMS_ATOMIC=1  #use drm atomic api or legacy api(two different)
$ export QT_QPA_EGLFS_HIDECURSOR=1  #hide cursor
$ demo/openglwindow

#xcb (Ubuntu Desktop)
$ apt install -y \
      libxcb-icccm4 \
      libxcb-image0 \
      libxcb-shm0 \
      libxcb-keysyms1 \
      libxcb-render0 \
      libxcb-render-util0  \
      libxcb-shape0 \
      libxcb-sync1 \
      libxcb-xfixes0 \
      libxcb-xinerama0 \
      libxcb-xkb1 \
      libxcb-randr0 \
      libsm6 \
      libice6 \
      libxkbcommon-x11-0

$ export QT_QPA_PLATFORM=xcb

## Cross Compile on Host

```shell
$ cd example/
$ qmake
$ make

           

總結

本文總結了開發闆和PC端部署Qt交叉編譯環境的過程,尚未測試Qt與opencv-python結合,編譯程式的方法。待測試後再更新此文。以上内容可能有遺漏或者錯誤的地方,歡迎各位指正。

繼續閱讀