文章目錄
- 前言
- 一、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這個檔案,如下圖紅框所示處:

-
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檔案中的提示方法:
安裝交叉編譯工具時,由于找不到aarch64-linux-gnu-gcc 和aarch64-linux-gnu-g++檔案的路徑,導緻無法在Qt Creator中進行環境配置,是以不使用該方法安裝交叉編譯工具。)sudo apt install -y crossbuild-essential-arm64
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盤複制到開發闆任意路徑下,執行./例子名稱 檔案,即可出現圖形界面,如下圖所示:
由此可在PC端的Qt交叉編譯庫可以正常使用。
3.3.3 安裝配置Qt Creator 4.8.6
-
安裝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賬号後點下一步,
沒有Qt賬号的可以注冊一下或者斷網後跳過登入這步。
安裝到預設路徑,在選擇元件時,隻勾選安裝Developer and Designer Tools即可,然後執行下一步等待安裝完成。
- 運作Qt Creator
#進入Qt Creator安裝路徑
cd /opt/Qt5.12.2/Tools/QtCreator/bin
sudo ./qtcreator.sh
即可運作Qt Creator。
- 配置Qt Creator交叉編譯環境
點選Qt Creator菜單欄中的工具→選項
在Kits中的QtVersion中手動設定添加Qt的qmake所在路徑,如下圖紅框處:
點選Apply應用生效。
在編譯器選項添加交叉編譯工具的aarch64-linux-gnu-gcc和aarch64-linux-gnu-g++檔案路徑,如下圖紅框處所示:
本文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版本等參數,修改的地方如下圖紅框處所示:
點選OK按鈕完成環境配置。
-
建立項目測試在Qt Creator中編譯的檔案能否在開發闆上運作
ctrl+N 建立項目,在點選下圖紅框處,建立 Qt Widgets Application,Choose後進入編輯頁面。
在項目中的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交叉編譯環境總結 編譯輸出視窗列印以下日志: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程式可以在開發闆上運作,如下圖所示:
至此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結合,編譯程式的方法。待測試後再更新此文。以上内容可能有遺漏或者錯誤的地方,歡迎各位指正。