i.mx6q 移植Qt5.9.1(完美支持opengl、Qt quick2、QML)

距離上篇文章移植Qt5.6.1有一年時(shí)間了, 最近剛好發(fā)現(xiàn)最新的QT LTS 5.9.1發(fā)布了,上次的移植對(duì)QML程序還存在問(wèn)題,無(wú)法運(yùn)行,想著看看5.9.1是不是可以有所進(jìn)展,在折騰了一個(gè)多星期后,這次終于有好消息了,如標(biāo)題所寫(xiě)!!!

下面就分享下如何打造一個(gè)能流暢運(yùn)行QML的i.mx6Q開(kāi)發(fā)板環(huán)境。

本人環(huán)境如下:

  1. 飛凌i.mx6Q開(kāi)發(fā)板,這個(gè)板子的Linux系統(tǒng)太老了,很多東西沒(méi)有,像SD卡升級(jí)內(nèi)核這種后期工廠批量生產(chǎn)的方式就不支持,早知道買(mǎi)NXP官網(wǎng)的了(好像淘寶有另一家用的是新內(nèi)核)。


    開(kāi)發(fā)板圖片
  2. Linux 3.0.35內(nèi)核,就因?yàn)槭沁@個(gè)老版本,導(dǎo)致多做了些工作,后面有說(shuō)。

  3. U-Boot 2009.08

  4. Ubuntu 14.04 64位

準(zhǔn)備工作

  1. 官網(wǎng)下載Qt5.9.1源代碼
  2. QT從5.8開(kāi)始,編譯工具就必須要支持C++11標(biāo)準(zhǔn)的才行,而GCC版本4.8以上才支持這個(gè)標(biāo)準(zhǔn),所以飛凌自帶的交叉工具鏈已經(jīng)不能拿來(lái)編譯Qt5.9.1了。網(wǎng)上找了幾個(gè)版本,發(fā)現(xiàn)太新的GCC在Linux3.0.35也會(huì)有問(wèn)題,最后找了個(gè)arm-4.8.1的,才運(yùn)行正常。(鏈接: https://pan.baidu.com/s/1pKAi0ER 密碼: f2jn)
  3. 自行百度裝好編譯開(kāi)發(fā)所需環(huán)境

編譯步驟

1. 解壓qt-everywhere-opensource-src-5.9.1.tar.xz
2. 解壓arm-none-linux-gnueabi-linux-4.8.1.tar.bz2到/opt目錄
3. 找出開(kāi)發(fā)板自帶的根文件系統(tǒng),并解壓到rootfs文件夾下面(我的為:/home/volfull/Workspace/rootfs/)

將GCC4.8.1的C庫(kù)文件覆蓋掉老根文件系統(tǒng)的C庫(kù)文件

$ cp /opt/arm-4.8.1/arm-none-linux-gnueabi/libc/lib/* /home/volfull/Workspace/rootfs/lib/

還需要同樣地覆蓋掉開(kāi)發(fā)板的/lib/里面的文件。

4. 修改QT的qmake.conf文件

$ cd qt-everywhere-opensource-src-5.9.1
$ vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

修改為:

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

#QT_QPA_DEFAULT_PLATFORM = eglfs   #linuxfb   

IMX6_CFLAGS             = -march=armv7-a -mfpu=neon -DLINUX=1 -DEGL_API_FB=1 
IMX6_CFLAGS_RELEASE     = -O2 $$IMX6_CFLAGS 
QMAKE_CFLAGS_RELEASE   += $$IMX6_CFLAGS_RELEASE 
QMAKE_CXXFLAGS_RELEASE += $$IMX6_CFLAGS_RELEASE 
QMAKE_CFLAGS_DEBUG     += $$IMX6_CFLAGS 
QMAKE_CXXFLAGS_DEBUG   += $$IMX6_CFLAGS

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf
QMAKE_CC                = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-gcc
QMAKE_CXX               = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK              = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB        = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR                = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-objcopy
QMAKE_NM                = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-nm -P

QMAKE_INCDIR            = /home/volfull/Workspace/rootfs/usr/include  
QMAKE_LIBDIR            = /home/volfull/Workspace/rootfs/lib  

#QMAKE_LIBDIR            += /home/volfull/Workspace/rootfs/usr/lib  

QMAKE_INCDIR_OPENGL_ES2 = /home/volfull/Workspace/rootfs/usr/include  
QMAKE_LIBDIR_OPENGL_ES2 = /home/volfull/Workspace/rootfs/usr/lib  

QMAKE_INCDIR_EGL = /home/volfull/Workspace/rootfs/usr/include  
QMAKE_LIBDIR_EGL = /home/volfull/Workspace/rootfs/usr/lib  


QMAKE_LIBS_OPENGL_ES1       += -lGLESv1_CM -lEGL -lGAL  
QMAKE_LIBS_OPENGL_ES1CL     += -lGLES_CL -lEGL -lGAL  
QMAKE_LIBS_EGL         += -lEGL -lGAL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL -lGAL  
QMAKE_LIBS_OPENVG      += -lOpenVG -lEGL -lGAL  
#QMAKE_LIBS             += -ljpeg -ldbus-1 -lrt -lpthread    #編譯選項(xiàng)  
#DISTRO_OPTS += hard-float          #浮點(diǎn)運(yùn)算使用軟件不使用硬件  


# Preferred eglfs backend  
EGLFS_DEVICE_INTEGRATION = eglfs_viv  

load(qt_config)

記得修改里面的路徑為你系統(tǒng)對(duì)應(yīng)的路徑!

5. 進(jìn)行配置

$ ./configure -release -xplatform linux-arm-gnueabi-g++ -no-opengl -opengl es2 -prefix ~/qt5.9.1-arm -opensource -confirm-license -make libs -nomake tools -nomake examples -nomake tests -skip qt3d -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtsensors -skip qtserialbus -skip qtspeech -skip qtsvg -skip qttools -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -no-feature-iconv -no-feature-gestures -no-qml-debug

正常不會(huì)出錯(cuò),可以看到結(jié)果如下:

Building on: linux-g++ (x86_64, CPU features: mmx sse sse2)
Building for: linux-arm-gnueabi-g++ (arm, CPU features: <none>)
Configuration: cross_compile compile_examples enable_new_dtags largefile precompile_header shared rpath release c++11 concurrent dbus no-pkg-config mremap no-qml-debug reduce_exports stl
Build options:
  Mode ................................... release
  Optimize release build for size ........ no
  Building shared libraries .............. yes
  Using C++ standard ..................... C++11
  Using gold linker ...................... no
  Using new DTAGS ........................ yes
  Using precompiled headers .............. yes
  Using LTCG ............................. no
  Target compiler supports:
    NEON ................................. no
  Build parts ............................ libs
Qt modules and options:
  Qt Concurrent .......................... yes
  Qt D-Bus ............................... yes
  Qt D-Bus directly linked to libdbus .... no
  Qt Gui ................................. yes
  Qt Network ............................. yes
  Qt Sql ................................. yes
  Qt Testlib ............................. yes
  Qt Widgets ............................. yes
  Qt Xml ................................. yes
Support enabled for:
  Using pkg-config ....................... no
  QML debugging .......................... no
  udev ................................... no
  Using system zlib ...................... no
Qt Core:
  DoubleConversion ....................... yes
    Using system DoubleConversion ........ no
  GLib ................................... no
  iconv .................................. no
  ICU .................................... no
  Logging backends:
    journald ............................. no
    syslog ............................... no
    slog2 ................................ no
  Using system PCRE2 ..................... no
Qt Network:
  getaddrinfo() .......................... yes
  getifaddrs() ........................... yes
  IPv6 ifname ............................ yes
  libproxy ............................... no
  OpenSSL ................................ no
    Qt directly linked to OpenSSL ........ no
  SCTP ................................... no
  Use system proxies ..................... yes
Qt Gui:
  Accessibility .......................... yes
  FreeType ............................... yes
    Using system FreeType ................ no
  HarfBuzz ............................... yes
    Using system HarfBuzz ................ no
  Fontconfig ............................. no
  Image formats:
    GIF .................................. yes
    ICO .................................. yes
    JPEG ................................. yes
      Using system libjpeg ............... no
    PNG .................................. yes
      Using system libpng ................ no
  EGL .................................... yes
  OpenVG ................................. no
  OpenGL:
    Desktop OpenGL ....................... no
    OpenGL ES 2.0 ........................ yes
    OpenGL ES 3.0 ........................ no
    OpenGL ES 3.1 ........................ no
  Session Management ..................... yes
Features used by QPA backends:
  evdev .................................. yes
  libinput ............................... no
  INTEGRITY HID .......................... no
  mtdev .................................. no
  tslib .................................. no
  xkbcommon-evdev ........................ no
QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes
  EGLFS details:
    EGLFS i.Mx6 .......................... yes
    EGLFS i.Mx6 Wayland .................. no
    EGLFS EGLDevice ...................... no
    EGLFS GBM ............................ no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no
    EGL on X11 ........................... no
  LinuxFB ................................ yes
  VNC .................................... yes
  Mir client ............................. no
Qt Widgets:
  GTK+ ................................... no
  Styles ................................. Fusion Windows
Qt PrintSupport:
  CUPS ................................... no
Qt Sql:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. no
  OCI (Oracle) ........................... no
  ODBC ................................... no
  PostgreSQL ............................. no
  SQLite2 ................................ no
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (Sybase) ........................... no
QtXmlPatterns:
  XML schema support ..................... yes
Qt QML:
  QML interpreter ........................ yes
  QML network support .................... yes
Qt Quick:
  Direct3D 12 ............................ no
  AnimatedImage item ..................... yes
  Canvas item ............................ yes
  Support for Qt Quick Designer .......... yes
  Flipable item .......................... yes
  GridView item .......................... yes
  ListView item .......................... yes
  Path support ........................... yes
  PathView item .......................... yes
  Positioner items ....................... yes
  ShaderEffect item ...................... yes
  Sprite item ............................ yes
Qt Wayland Client ........................ no
Qt Wayland Compositor .................... no
Qt Quick Controls 2:
  Styles ................................. Default Material Universal
Qt Quick Templates 2:
  Hover support .......................... yes
  Multi-touch support .................... yes

Note: Also available for Linux: linux-clang linux-icc

Note: No wayland-egl support detected. Cross-toolkit compatibility disabled.

WARNING: Cross compiling without sysroot. Disabling pkg-config
6. 開(kāi)始編譯

$ make -j8

這里會(huì)花一些時(shí)間,按照我的步驟走應(yīng)該不會(huì)出錯(cuò)。

7. 生成最后的安裝文件夾

$ make install

生成這個(gè)文件夾~/qt5.9.1-arm,將這個(gè)文件夾拷貝到開(kāi)發(fā)板的根文件系統(tǒng)/opt下面。到這步Qt5.9.1的移植工作就算做好了,恭喜恭喜。

8. 運(yùn)行時(shí)提示缺少字體

新版本的Qt是不自帶字體文件的了,需要自行網(wǎng)上找個(gè)字體文件放到開(kāi)發(fā)板的/opt/qt5.9.1-arm/lib/fonts下面,如wqy-zenhei.ttc。


附:開(kāi)發(fā)板上qt5.9.1的環(huán)境變量(QT_ROOT 是你開(kāi)發(fā)板上qt5.9.1的路徑):

#!/bin/sh

##qt5.9.1-arm
export QT_ROOT=/opt/qt5.9.1-arm
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
export QML2_IMPORT_PATH=$QT_ROOT/qml
export QT_QPA_PLATFORM=eglfs
export QT_EGLFS_IMX6_NO_FB_MULTI_BUFFER=2
export QT_QPA_EGLFS_PHYSICAL_WIDTH=698             #根據(jù)你的顯示器設(shè)置寬度,單位mm
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=392           #根據(jù)你的顯示器設(shè)置高度,單位mm

關(guān)于如何用Qt Creator編譯arm版本的程序,設(shè)置下交叉工具鏈就可以了,很簡(jiǎn)單,網(wǎng)上也有參考,這里就不說(shuō)了。
運(yùn)行一個(gè)Qt Creator自帶的QML例子,會(huì)發(fā)現(xiàn)動(dòng)畫(huà)效果很流暢。

這篇文章基本把許多坑都繞過(guò)去了,有問(wèn)題也歡迎留言討論。

都看到這里了,請(qǐng)順手幫忙點(diǎn)個(gè)“喜歡”!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容