距離上篇文章移植Qt5.6.1有一年時間了, 最近剛好發(fā)現(xiàn)最新的QT LTS 5.9.1發(fā)布了姜骡,上次的移植對QML程序還存在問題导坟,無法運行,想著看看5.9.1是不是可以有所進展圈澈,在折騰了一個多星期后惫周,這次終于有好消息了,如標(biāo)題所寫!!!
下面就分享下如何打造一個能流暢運行QML的i.mx6Q開發(fā)板環(huán)境康栈。
本人環(huán)境如下:
-
飛凌i.mx6Q開發(fā)板递递,這個板子的Linux系統(tǒng)太老了喷橙,很多東西沒有,像SD卡升級內(nèi)核這種后期工廠批量生產(chǎn)的方式就不支持登舞,早知道買NXP官網(wǎng)的了(好像淘寶有另一家用的是新內(nèi)核)重慢。
開發(fā)板圖片 Linux 3.0.35內(nèi)核,就因為是這個老版本逊躁,導(dǎo)致多做了些工作似踱,后面有說。
U-Boot 2009.08
Ubuntu 14.04 64位
準(zhǔn)備工作
- 官網(wǎng)下載Qt5.9.1源代碼
- QT從5.8開始稽煤,編譯工具就必須要支持C++11標(biāo)準(zhǔn)的才行核芽,而GCC版本4.8以上才支持這個標(biāo)準(zhǔn),所以飛凌自帶的交叉工具鏈已經(jīng)不能拿來編譯Qt5.9.1了酵熙。網(wǎng)上找了幾個版本轧简,發(fā)現(xiàn)太新的GCC在Linux3.0.35也會有問題,最后找了個arm-4.8.1的匾二,才運行正常哮独。(鏈接: https://pan.baidu.com/s/1pKAi0ER 密碼: f2jn)
- 自行百度裝好編譯開發(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. 找出開發(fā)板自帶的根文件系統(tǒng),并解壓到rootfs文件夾下面(我的為:/home/volfull/Workspace/rootfs/)
將GCC4.8.1的C庫文件覆蓋掉老根文件系統(tǒng)的C庫文件
$ cp /opt/arm-4.8.1/arm-none-linux-gnueabi/libc/lib/* /home/volfull/Workspace/rootfs/lib/
還需要同樣地覆蓋掉開發(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 #編譯選項
#DISTRO_OPTS += hard-float #浮點運算使用軟件不使用硬件
# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_viv
load(qt_config)
記得修改里面的路徑為你系統(tǒng)對應(yīng)的路徑皮璧!
5. 進行配置
$ ./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
正常不會出錯,可以看到結(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. 開始編譯
$ make -j8
這里會花一些時間分飞,按照我的步驟走應(yīng)該不會出錯悴务。
7. 生成最后的安裝文件夾
$ make install
生成這個文件夾~/qt5.9.1-arm,將這個文件夾拷貝到開發(fā)板的根文件系統(tǒng)/opt下面譬猫。到這步Qt5.9.1的移植工作就算做好了讯檐,恭喜恭喜。
8. 運行時提示缺少字體
新版本的Qt是不自帶字體文件的了染服,需要自行網(wǎng)上找個字體文件放到開發(fā)板的/opt/qt5.9.1-arm/lib/fonts下面别洪,如wqy-zenhei.ttc。
附:開發(fā)板上qt5.9.1的環(huán)境變量(QT_ROOT 是你開發(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è)置下交叉工具鏈就可以了诚亚,很簡單晕换,網(wǎng)上也有參考,這里就不說了站宗。
運行一個Qt Creator自帶的QML例子闸准,會發(fā)現(xiàn)動畫效果很流暢。