By Toradex秦海

1). 簡介

Qt圖形開發框架作為嵌入式ARM平臺配合Embedded Linux系統最常用的圖形界面開發工具已經被廣泛使用,針對基于Ycoto項目編譯的Embedded Linux系統,可以非常方便的通過OpenEmbedded開發環境將特定版本的Qt開源版本運行庫集成到Embedded Linux系統里面,比如Ycoro release 2.4支持的是Qt 5.9 版本,而當所需要的Qt版本不是這個版本的時候,比如Qt 5.12,那么就需要通過源代碼進行交叉編譯,本文即進行相關測試示例。

 

本文演示所使用的ARM平臺來自Toradex基于NXP iMX6Q SoC平臺的Apalis iMX6 ARM核心板。

 

2). 準備

a). Apalis iMX6Q ARM核心版配合Apalis Evaluation Board載板,連接調試串口UART1(載板X29)到開發主機方便調試。更多關于Apalis iMX6配合Apalis Evaluation Board載板的說明請參考Datasheet開發上手指南

 

b). Apalis iMX6Q 安裝Toradex Linux BSP V2.8 Embedded Linux,系統基于Ycoto Project/OpenEmbedded 編譯環境,編譯方法請參考這里,編譯好的Linux Image安裝方法請參考這里

 

 

3). 編譯環境配置

a). 首先下載Apalis iMX6對應的SDK

./ 下載地址 - https://developer1.toradex.com/files/toradex-dev/uploads/media/Colibri/Linux/SDKs/

選擇對應的版本和模塊進行下載,這里進入 2.8/apalis-imx6/angstrom-lxde-image/ 下進行下載

 

b). 安裝SDK,可以安裝到默認目錄 /usr/local/oecore-x86_64,也可以安裝到其他定制目錄,如 $home 下面

-----------------------

user@host:~$ cd

user@host:~$ chmod +x angstrom-glibc-x86_64-armv7at2hf-neon-v2016.12-toolchain.sh

user@host:~$ ./angstrom-glibc-x86_64-armv7at2hf-neon-v2016.12-toolchain.sh

Angstrom SDK installer version nodistro.0

=========================================

Enter target directory for SDK (default: /usr/local/oecore-x86_64):

You are about to install the SDK to "/usr/local/oecore-x86_64". Proceed[Y/n]? y

-----------------------

 

c). 修改安裝目錄下的環境變量輸出配置文件

默認環境變量配置文件為 - /usr/local/oecore-x86_64/environment-setup-armv7at2hf-neon-angstrom-linux-gnueabi,修改為如下:

https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/environment-setup-qt-default

 

 

4). Qt 5.12 源代碼下載以及配置

a). 從下面地址下載并解壓Qt 5.12 開源版最新源代碼 tar.xz 壓縮包,本文當前最新版本是5.12.4

https://download.qt.io/archive/qt/5.12/

-----------------------

$ wget https://download.qt.io/archive/qt/5.12/5.12.4/single/qt-everywhere-src-5.12.4.tar.xz

$ tar Jxf qt-everywhere-src-5.12.4.tar.xz

$ cd qt-everywhere-src-5.12.4

-----------------------

 

b). 配置文件

./ 首先,因為是交叉編譯,因此要使用 qtbase/mkspecs/devices/ 目錄下的嵌入式設備對應的qmake配置文件,不過由于預置的針對 NXP iMX6 linux-imx6-g++ 對應的qmake.conf默認是針對 eglfs 文件系統的,而本文測試使用的Toradex默認 Linux BSP是基于X11顯示的,因此需要做相應修改。

 

qtbase/mkspecs/devices/linux-imx6-g++/qmake.conf 修改為如下:

https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/qmake.conf

 

./ 然后創建configure 配置文件 build_configure.sh如下,主要用于coonfigure配置參數設置,選定xcbX11)支持等,也可以通過 -skip-<qtmodule> 來忽略編譯某些qt模塊,本文默認編譯全部。

https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/build_configure.sh

 

更多的configure選項可以通過 configure --help 來查看,一個完整的help相關打印輸出參考如下:

https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/qt5.12_configure-help-printout

 

 

5). Qt 5.12 源代碼交叉編譯

a). 首先輸出上面章節3準備好的編譯環境環境變量

-----------------------

$ source /usr/local/oecore-x86_64/environment-setup-qt-default

-----------------------

 

b). 然后在同一個shell下面執行 build_configure.sh 來進行configure

-----------------------

$ ./ build_configure.sh

-----------------------

 

Configure成功后,會打印羅列要編譯的相關組件,可以再次確認下是否符合要求

-----------------------

Configure summary:

 

Building on: linux-g++ (x86_64, CPU features: mmx sse sse2)

Building for: devices/linux-imx6-g++ (arm, CPU features: neon)

Target compiler: gcc 6.2.1

Configuration: cross_compile use_gold_linker compile_examples enable_new_dtags largefile neon shared rpath release c++11 c++14 concurrent dbus reduce_exports stl

Build options:

  Mode ................................... release

  Optimize release build for size ........ no

  Building shared libraries .............. yes

  Using C standard ....................... C11

  Using C++ standard ..................... C++14

  Using ccache ........................... no

  Using gold linker ...................... yes

  Using new DTAGS ........................ yes

  Using precompiled headers .............. no

  Using LTCG ............................. no

  Target compiler supports:

    NEON ................................. yes

  Build parts ............................ libs

OpenGL:

    Desktop OpenGL ....................... no

    OpenGL ES 2.0 ........................ yes

    OpenGL ES 3.0 ........................ yes

    OpenGL ES 3.1 ........................ no

    OpenGL ES 3.2 ........................ no

X11 specific:

    XLib ................................. yes

    XCB Xlib ............................. yes

    EGL on X11 ........................... yes

-----------------------

 

c). 執行make進行編譯,由于完整編譯需要時間比較長,可以先嘗試單獨編譯qtbase組件,如果編譯成功再進行完整編譯以提高效率

-----------------------

# compile qt-base

$ make module-qtbase

# compile all components

$ make

-----------------------

 

d). make成功沒有錯誤后,再執行make install進行安裝,安裝目錄通過上面 build_configure.sh腳本 -prefix 參數定義,比如本文則位于 ${SDKTARGETSYSROOT}/usr/local/Qt-5.12.4

-----------------------

$ make install

-----------------------

 

e). 安裝成功后,將Qt編譯輸出目錄打包上傳以便在Apalis iMX6系統中部署測試

-----------------------

# pack Qt related outputs

$ cd ${SDKTARGETSYSROOT}/usr/local/

$ tar cvf Qt-5.12.4.tar.bz2 Qt-5.12.4/

# scp tar package to Apalis iMX6 Linux $HOME

$ scp Qt-5.12.4.tar.bz2 root@apalis_imx6_ipaddress:/home/root

-----------------------

 

 

6). Qt 5.12 部署測試

a). 首先將Qt 5.12 相關文件部署到Apalis iMX6 Linux /opt 目錄下

-----------------------

root@apalis-imx6$ cd /opt

root@apalis-imx6$ tar xvf ~/ Qt-5.12.4.tar.bz2

-----------------------

 

b). 準備測試應用,分別使用下面兩個Qt Widget  Qt Quick 應用來測試

./ helloworldUI - Qt Widget 應用,調用GPIO來驅動LED,詳細代碼和說明參考這里

./ videotest – Qt Quick 應用,通過QtMultimedia組件來播放視頻以及調用攝像頭,詳細代碼和說明參考這里

 

將上述兩個項目針對Apalis iMX6編譯好的可執行文件以及所需要的視頻文件復制到Apalis iMX6 Linux $HOME

-----------------------

$ scp helloworldUI videotest ready-player-one-trailer-2_h720p.mov root@apalis_imx6_ipaddress:/home/root

-----------------------

 

c). Apalis IMX6 Linux $HOME 下創建如下測試腳本 qttest.sh, 并通過分別注釋領一個應用的方式來測試上述兩個應用。

./ qttest.sh - https://github.com/simonqin09/Qt5.12_source_code_compile/blob/master/qttest.sh

 

./ 測試 helloworldUI 應用,如下可見界面顯示以及GPIO控制都正常工作,電阻式觸摸也工作正常

                                              image001.png

./ 測試 videotest 應用,如下可見界面顯示,視頻播放以及攝像頭捕獲均工作正常,電阻式觸摸也工作正常

image002.png

 

 

7). 總結

本文示例了基于ARM嵌入式平臺對Qt 5.12 源代碼進行交叉編譯以及部署。