i.mx6q 移植Qt5.6.1(含opengl)

(2017.8.1更新:Qt5.9.1完美移植,支持QML请看这篇:http://www.jianshu.com/p/9cc782436ece


开发板图片

飞凌imx6q的开发板自带的qt版本是4.8.5的,版本太老,决定移植个LTS长期支持的新版本5.6。

新版本对qt quick的支持很完善了,所以打算项目的程序用qml来开发,这样MVC架构代码与界面可以很好的分开来,降低各个功能模块之间的耦合度。

但qt5要支持qt quick的话就必须让Qt支持opengl,如下官网http://doc.qt.io/qt-5/embedded-linux.html 所说:

Building Qt for a given device requires a toolchain and a sysroot. Additionally, some devices require vendor-specific adaptation code for EGL and OpenGL ES 2.0 support. This is not relevant for non-accelerated platforms, for example the ones using the LinuxFB plugin, which is meant for software-based rendering only. This means Qt Quick 2 is not functional in such a setup as it depends on OpenGL for rendering.

还好i.mx6Q技术手册写着是支持opengl功能的。下面开始:

1. 下载qt5.6.1源码

到官网:
http://download.qt.io/archive/qt/5.6/5.6.1-1/single/
找到
qt-everywhere-opensource-src-5.6.1-1.tar.gz
下载最新的qt5.6.1-1源码包。

2. 解压qt5.6.1源码

$ tar zxvf qt-everywhere-opensource-src-5.6.1-1.tar.gz -C ~/Workspace/qt-everywhere-opensource-src-5.6.1

解压路径自己定,后面都是按这个路径来讲解的,注意修改成你们自己的。

3. 解压交叉编译工具链

将飞凌提供的gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12解压到此处(路径可自己修改):

~/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/

飞凌提供的百度网盘的gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar 是有问题的(180M),正常是280M的,可以自行在网上按这个文件名另搜索个下载。

4. 修改交叉编译工具到qmake.conf

$ cd ~/Workspace/qt-everywhere-opensource-src-5.6.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 = linuxfb   
QMAKE_CFLAGS_RELEASE   +=-O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a

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

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

# modifications to linux.conf
QMAKE_AR                = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = arm-none-linux-gnueabi-objcopy
QMAKE_NM                = arm-none-linux-gnueabi-nm -P
QMAKE_STRIP             = arm-none-linux-gnueabi-strip


QMAKE_INCDIR            += /home/volfull/Workspace/rootfs/usr/include  
QMAKE_LIBDIR            += /home/volfull/Workspace/rootfs/usr/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  
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  


include(../common/linux_arm_device_post.conf)  

load(qt_config)
  • 上面的配置是已经包含了opengl需要的参数;
  • /home/volfull/Workspace/rootfs/ 为飞凌开发板的文件系统,在飞凌提供的百度网盘上面可以找到;
  • arm-none-linux-gnueabi- 为飞凌提供的交叉工具链;

5. 增加编译脚本build.sh

$ cd ~/Workspace/qt-everywhere-opensource-src-5.6.1
$ vi build.sh

./configure -release \
        -opensource -confirm-license \
        -no-c++11  \
        -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-avx2 \
        -no-mips_dsp -no-mips_dspr2 \
    -no-opengl -opengl es2 \
        -qt-zlib -no-mtdev \
        -qt-sql-sqlite \
        -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz \
        -no-openssl -no-xinput2 -no-xcb-xlib -no-glib \
        -nomake examples -make libs \
        -nomake tools -nomake tests \
        -gui -widgets \
        -optimized-qmake -no-nis -no-cups -no-iconv \
        -no-tslib -no-icu -no-fontconfig -strip \
        -no-pch -no-dbus \
        -force-asserts \
        -no-xcb -no-directfb -linuxfb -no-kms \
        -qpa linux \
        -xplatform linux-arm-gnueabi-g++ \
        -libinput \
        -no-gstreamer -no-system-proxies \
        -prefix ~/qt5.6.1-1-arm -v

chmod +x build.sh

  • -prefix ~/qt5.6.1-1-arm -v 为后面make install 时安装的路径,自行修改;

6. 交叉编译opengl所需的库

(1)下载 expat

CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/opt/EmbedRigol/install-dev/expat-2.1.0

其中安装路径是 /opt/EmbedRigol/install-dev/expat-2.1.0;

  • make
  • make install
(2)下载 libdbus.so
  • 源码的下载网址为 http://dbus.freedesktop.org/releases/dbus/ ,我这里下载 1.2.30 版本;
  • 解压在 /opt/EmbedRigol/ 文件夹下,完整路径是 /opt/EmbedRigol/dbus-1.2.30;
  • 进入源码目录,执行下面的语句进行编译配置:

CC=arm-none-linux-gnueabi-gcc ./configure CFLAGS=-I/opt/EmbedRigol/install-dev/expat-
2.1.0/include LDFLAGS=-L/opt/EmbedRigol/install-dev/expat-2.1.0/lib

  • make
  • make install
  • 将 /opt/EmbedRigol/install-dev/dbus-1.2.30/lib 文件夹下libdbus-1.so 相关的文件拷贝到开发板文件系统的rootfs的 lib 文件夹下;
出错处理:
以上2个库make install时会报错,说arm-linux-ranlib找不到;
在它们解压源码根目录下运行: vi libtool ,找到RANLIB="arm-linux-ranlib",将其修改为(路径记得改成你们自己的):

RANLIB="/home/volfull/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-ranlib"

7. 添加交叉编译工具链路径到环境变量

$ PATH=~/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin:$PATH

8. 交叉编译Qt

$ cd ~/Workspace/qt-everywhere-opensource-src-5.6.1
$ ./build.sh

结果如下:


Build options:
  Configuration .......... accessibility alsa audio-backend clock-gettime clock-monotonic compile_examples concurrent cross_compile eglfs_viv enable_new_dtags evdev eventfd force_asserts freetype full-config getaddrinfo getifaddrs harfbuzz inotify ipv6ifname large-config largefile linuxfb medium-config minimal-config mremap no-pkg-config opengl opengles2 pcre png posix_fallocate qpa qpa reduce_exports release release_tools rpath shared small-config threadsafe-cloexec zlib
  Build parts ............  libs
  Mode ................... release; optimized tools
  Using sanitizer(s)...... none
  Using C++ standard ..... c++98
  Using gold linker....... no
  Using new DTAGS ........ yes
  Using PCH .............. no
  Using LTCG ............. no
  Target compiler supports:
    Neon ................. no

Qt modules and options:
  Qt D-Bus ............... no
  Qt Concurrent .......... yes
  Qt GUI ................. yes
  Qt Widgets ............. yes
  Large File ............. yes
  QML debugging .......... yes
  Use system proxies ..... no

Support enabled for:
  Accessibility .......... yes
  ALSA ................... yes
  CUPS ................... no
  Evdev .................. yes
  FontConfig ............. no
  FreeType ............... qt
  Glib ................... no
  GStreamer .............. no
  GTK theme .............. no
  HarfBuzz ............... yes (bundled copy)
  Iconv .................. no
  ICU .................... no
  Image formats:
    GIF .................. yes (plugin, using bundled copy)
    JPEG ................. yes (plugin, using bundled copy)
    PNG .................. yes (in QtGui, using bundled copy)
  libinput................ no
  Logging backends:
    journald ............... no
    syslog   ............... no
  mtdev .................. no
  Networking:
    getaddrinfo .......... yes
    getifaddrs ........... yes
    IPv6 ifname .......... yes
    libproxy.............. no
    OpenSSL .............. no
  NIS .................... no
  OpenGL / OpenVG:
    EGL .................. no
    OpenGL ............... yes (OpenGL ES 2.0+)
    OpenVG ............... no
  PCRE ................... yes (bundled copy)
  pkg-config ............. no
  PulseAudio ............. no
  QPA backends:
    DirectFB ............. no
    EGLFS ................ no
      EGLFS i.MX6 ........ yes
      EGLFS i.MX6 Wayland. no
      EGLFS EGLDevice .... no
      EGLFS GBM .......... no
      EGLFS Mali ......... no
      EGLFS Raspberry Pi . no
      EGLFS X11 .......... no
    LinuxFB .............. yes
    Mir client............ no
    XCB .................. no
  Session management ..... yes
  SQL drivers:
    DB2 .................. no
    InterBase ............ no
    MySQL ................ no
    OCI .................. no
    ODBC ................. no
    PostgreSQL ........... no
    SQLite 2 ............. no
    SQLite ............... qt-qt
    TDS .................. no
  tslib .................. no
  udev ................... no
  xkbcommon-x11........... no
  xkbcommon-evdev......... no
  zlib ................... yes (bundled copy)


NOTE: Qt is using double for qreal on this system. This is binary incompatible against Qt 5.1.
Configure with '-qreal float' to create a build that is binary compatible with 5.1.

NOTE: -optimized-tools is not useful in -release mode.

Cannot read /home/volfull/Workspace/qt-everywhere-opensource-src-5.6.1/qtbase/mkspecs/common/linux_arm_device_post.conf: No such file or directory

        NOTICE: The -no-c++11 / --c++-level=c++98 option is deprecated.

        Qt 5.7 will require C++11 support. The options are in effect for this
        Qt 5.6 build, but you should update your build scripts to remove the
        option and, if necessary, upgrade your compiler.

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /home/volfull/qt5.6.1-1-arm

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

$ make
$ make install


按照上面的流程下来,应该是不会出现任何问题的。make install 后即可在~/qt5.6.1-1-arm 找到编译好的qt库,将这个文件夹全部拷贝到开发板上完成qt移植工作。tslib触摸屏的库移植自行网上搜索。


附带开发板上qt5.6.1的环境变量(QT_ROOT 是你开发板上qt5.6.1的路径):

##qt5.6.1-1
export QT_ROOT=/opt/qt5.6.1-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


遗留问题:


  • qt quick的相关库是编译出来了,但用qml写的程序放到开发板上运行不了,提示:
root@freescale /home/app$ ./qml_test
QML debugging is enabled. Only use this in a safe environment.
jzw;pwm_backlight_update_status:s_bl_en=1
This plugin does not support createPlatformOpenGLContext!
Failed to create OpenGL context for format QSurfaceFormat(version 2.0, options QFlags(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior 2, swapInterval 1, profile  0)
Aborted

目前还没找到解决方法,所以跑qml最后还是悲剧收场*&*,如果你们有办法的话也请告诉我一下。。。

  • qt4.8.5跑自带的demo ./fluidlauncher 2秒就起来了,qt5.6.1跑最简单自建的C++写的模板程序需要9秒才能起来,这速度够慢的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容