移植Qt5.6到imx6系列处理器移植过程说明--支持qml

需要word版本的同学可自行下载:点此下载

由于项目需要,领导要求实现Qt5的移植,目标板是imx6sx,且界面一定要炫酷.....好吧,既然要炫酷,当然要利用Qt的qml,然而qml又需要opengl的支持。

于是便开始了虐心的Qt5.6移植之旅,我的移植过程大体可以分为三个阶段,也是自己探索的过程。

第一阶段,我尝试手动移植opengl和Qt,然而需要的第三方库数不胜数,且中间错误频出,所以改变策略,进入第二阶段

第二阶段,使用yocto移植Qt5,yocto很好用,但是编译时间比较长,大部分时间用来下载,但不管怎么说,使用这种方法成功了,但是缺点是yocto的每一个版本只有一个QT版本,而yocto版本又是随着内核版本更新的,比如最新版本的yocto源码包含的是Qt5.5.1,而我要移植的是Qt5.6版本,原因有两点,1、5.6是LTS版本,2、5.6版本比5.5版本多了一些我需要的控件,比如Qt.lab.controls中的drawer。我试过直接替换其中Qt源码为5.6版本,但是仍然是错误频出。所以进入第三阶段

第三阶段,我使用yocto生成opengl等相关库,然后再手动编译Qt5.6,最终测试成功。

移植过程如下:

开发环境说明

操作系统:windows7 x64

宿主机:vmware10+Ubuntu14.04LTS32bit

目标机:i.mx6sx

 

使用工具说明

Yocto是一个开源社区,它通过提供模版、工具和方法帮助开发者创建基于linux内核的定制系统。具体的yocto使用方法请参考YoctoProject Quick Start

 

Bitbakeyocto提供的构建工具,可以使用bitbake命令生成特定的镜像、单独编译某一个模块、清除生成的文件等等,它的功能类似于make

 

RepoGooglepython脚本写的调用Git的脚本,它与git的区别是,repo可以一次性从多个仓库获取资源到本地。

 

Linaro是由ARM飞思卡尔IBMSamsungST-Ericsson 及德州仪器 (TI)等半导体厂商联合创立的非营利性质的开源软件公司。致力于开发不同半导体公司系统单芯片(SoC)平台的共通软件。在编译Qt5的过程中,我们使用linaro提供的交叉编译工具,经过测试4.6版本与3.10.17版本的sysroot可配合使用,4.6版本与4.1.15版本sysroot配合使用会出问题,找不到libc库。4.84.9版本经过测试可以与4.1.15版本sysroot配合使用。目前linaro官方提供的最新版本是5.3版本,尚未测试。

 

依赖关系说明

Qt quick模块需要opengl支持来生成libQt5OpenGL.so等相关库文件,opengl库由于涉及到gpu,所以又跟内核与设备树息息相关,一个可用的opengl库必须满足两点:1,可用于对应的目标机器 2、与对应的内核版本匹配。所以可以看到网上下载的gpu库的命名格式为gpu-viv-bin-machine-kernelVersion,例如:gpu-viv-bin-imx6q-3.10.17-1.0.0.tar.gz

由上所述,我们可以知道,Qt5的移植也需要与内核版本保持一致,换句话说,更换内核版本后意味着要重新移植与之匹配的Qt5

 

使用yocto移植Qt5过程说明

1、 安装Ubuntu,也可以使用其他操作系统,但是yocto官方提供的手册中都是以Ubuntu为例,建议安装Ubuntu14.04LTS版本,且最少分配100G的磁盘空间。安装过程不做说明。

2、 安装移植过程中Ubuntu系统所需要的软件包

$ sudo apt-get installgawk wget git-core diffstat unzip texinfo gcc-multilib \

build-essential chrpath socat

$ sudo apt-get install libsdl1.2-dev xterm sed cvssubversion coreutils texi2html \

docbook-utils python-pysqlite2 help2man make gcc g++desktop-file-utils \

libgl1-mesa-dev libglu1-mesa-dev mercurialautoconf automake groff curl lzop asciidoc

$ sudo apt-get install u-boot-tools

3、 安装repo

$ mkdir ~/bin

$ curlhttp://php.webtutor.pl/en/wp-content/uploads/2011/09/repo > ~/bin/repo

$ chmod a+x ~/bin/repo

$ export PATH=~/bin:$PATH

4、  同步yocto工程

$ mkdir fsl-release-bsp

$ cd fsl-release-bsp

$ git config --globaluser.name "Your Name"

$ git config --globaluser.email "Your Email"

$ git config --list

$ repo init -ugit://git.freescale.com/imx/fsl-arm-yocto-bsp.git -b imx-3.14.28-1.0.0_ga

$ repo sync

5、  配置构建选项

3.14.28版本

$ MACHINE=imx6qsabreauto sourcefsl-setup-release.sh –bbuild-fb –e fb

4.1.15版本

$ MACHINE=imx6qsabreauto sourcefsl-setup-release.sh –bbuild-fb DISTRO=fsl-imx-fb

如上所示,不同的yocto工程版本的配置命令略有不同,具体的命令需要参考对应版本源码中的README文件。

6、  构建镜像

$ bitbake fsl-image-qt5

其中fsl-image-qt5为配方名称,可以使用如下命令查看配方。

$ bitbake –s

这个命令会列出所有的配方,但是由于yocto支持的厂家不止飞思卡尔一家,所以显示出来的配方会特别多,可以使用下面命令查找自己所需要的配方。

$ bitbake –s | grep qt              列出所有可生成qt的配方

$ bitbake –s | grep fsl              列出所有飞思卡尔处理器可使用的配方

$ bitbake –s | grep toolchain    列出所有工具链的配方

在构建的过程中可能会出现错误,一个通用的解决办法是,先清除构建出问题的任务,然后再重新构建。

$ bitbake –c cleanall taskname

$ bitbake –c build taskname

$ bitbake fsl-image-qt5

由于构建镜像的过程,多个包之间存在依赖关系,有时候生成的构建队列的顺序会有问题,比如A依赖B,但是在构建队列中,A在B之前构建,这个时候A就会找不到B,从而出现错误,这种问题的解决办法是,先清除A,然后手动构建B,然后再重新bitbake。但是前提是要了解他们之间的依赖关系。

$ bitbake –c cleanall A

$ bitbake –c build B

$ bitbake fsl-image-qt5

7、 上一步成功之后,官方提供的u-boot、zImage、rootfs就已经生成了,它们所在的路径是:BUILDDIR/tmp/deploy/image/imx6sxsabresd/,在生成的文件系统中,已经包含了移植好的Qt5,且gpu需要的相关库也已经生成。但是Qt开发还需要qmake,而qmake可以使用生成工具链相关的配方构建,执行下面命令:

$ bitbake fsl-toolchain-qt5

这个命令执行成功后,会在BUILDDIR/tmp/deploy/路径下生成sdk目录,执行sdk目录下的脚本文件

$ sh BUILDDIR/tmp/deploy/sdk/xxxxxxxxx.sh

运行该脚本后,会在/opt目录下生成工具链和qmake。

 

至此,使用yocto移植Qt5就已经完成了,如果对Qt版本以及内核版本没有特殊要求的话,就可以使用上面生成的SDK来进行Qt应用程序的开发了。如果对于Qt版本以及内核版本有特殊要求的话,那么就需要继续完成下面的操作,来获取你想要的版本,因为yocto工程的每一个分支都提供一个确定版本的Qt配方,比如,如果你选择使用4.1.15版本内核,那么意味着你就必须使用Qt5.5.1版本,我曾尝试过直接替换yocto工程Qt5层的配方,但是最终生成的镜像对于字体没有很好的支持,通过查阅资料,我了解到,同一层的所有配方最好是隶属于同一分支,否则可能会出问题,甚至无法生成镜像,因为各层之间是互相关联的,且yocto工程源码、补丁众多,想要修改配方文件亦无从下手。所以最好的方法是,使用yocto生成sysroot,然后使用生成的sysroot手动移植Qt5。

 

手动移植Qt5过程说明

1、  下载所需源码,清单如下:

qt-everywhere-opensource-src-5.6.0.tar.gz

gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.gz

2、  使用yocto获取sysroot,根据自己的需要可自行选择内核版本。此步骤在上面已经介绍过了,此处不做赘述,我们需要的sysroot的路径为:build/tmp/sysroots/machieName/

3、  解压已经下载的qt源码以及交叉编译工具,将交叉编译工具的路径添加到PATH,并声明CROSS_COMPILE。

exportCROSS_COMPILE=${cross compile dir}/bin/arm-linux-gnueabihf-

export PATH=${cross compile dir}/bin

4、 编辑qmake.conf,路径在Qt源码下qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf,我的qmake.conf如下。

MAKEFILE_GENERATOR      = UNIX

CONFIG                 += incremental

QMAKE_INCREMENTAL_STYLE= sublib

 

include(../common/linux.conf)

include(../common/gcc-base-unix.conf)

include(../common/g++-unix.conf)

 

QMAKE_LIBS_EGL         += -lEGL

QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL -lGAL

QMAKE_LIBS_OPENVG      += -lOpenVG -lEGL -lGAL

 

IMX6_CFLAGS             = -march=armv7-a -mfloat-abi=hard-mfpu=neon -mtune=cortex-a9

QMAKE_CFLAGS           += $$IMX6_CFLAGS

QMAKE_CXXFLAGS         += $$IMX6_CFLAGS

 

DISTRO_OPTS+= hard-float

 

#Preferred eglfs backend

EGLFS_DEVICE_INTEGRATION= eglfs_viv

 

QT_QPA_DEFAULT_PLATFORM= eglfs

QMAKE_CFLAGS_RELEASE   += -O2 $$QMAKE_CFLAGS

QMAKE_CXXFLAGS_RELEASE+= -O2 $$QMAKE_CXXFLAGS

 

#modifications to g++.conf

QMAKE_CC                = arm-linux-gnueabihf-gcc

QMAKE_CXX               = arm-linux-gnueabihf-g++

QMAKE_LINK              = arm-linux-gnueabihf-g++

QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

 

#modifications to linux.conf

QMAKE_AR                = arm-linux-gnueabihf-ar cqs

QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy

QMAKE_NM                = arm-linux-gnueabihf-nm -P

QMAKE_STRIP             = arm-linux-gnueabihf-strip

#include(../devices/common/linux_arm_device_post.conf)

load(qt_config)

5、 配置Qt,我的配置如下:

./configure--prefix=/QtInstall -c++std c++11 -debug-and-release -qt-zlib -qt-libpng \

-xplatformlinux-arm-gnueabi-g++ -qt-freetype -fontconfig -no-directfb -qt-pcre \

-sysconfdir/QtInstall/sysconf -nomake tests -nomake examples -no-xcb -no-iconv \

-eglfs-opengl es2 -pkg-config \

-device-optionCROSS_COMPILE=/opt/crossCompile-linaro-4.9/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-\

-sysroot/home/yocto/fsl-release-bsp/bld-fb/tmp/sysroots/imx6sxsabresd –v

 

   其中字体配置部分选项,如果配置了fontconfig,那么freetype则使用系统提供的库,如果没有配置fontconfig,则freetype可以配置为-qt-freetype,即使用qt提供的freetype。但是qt5.6的官网文档中特别指出:

   Qt no longer ships anyfonts in thelib/fonts directory. This means thatit is up to the platform (the system image) to provide the necessary fonts.

   这意味着Qt虽然提供字体支持,但是不再集成字库到lib下。所以,为了避免因此产生的影响,我们使用系统提供的字体支持,但是前提是你已经获取了libfreetype.so。通常这些库文件sysroot已经提供。

配置完成后,会有just run ‘make’的提示。我的配置结果如下:

Build options:

Configuration .......... accessibility alsa audio-backend c++11clock-gettime clock-monotonic compile_examples concurrent cross_compile dbusdbus-linked egl eglfs eglfs_gbm eglfs_viv enable_new_dtags evdev eventfdfontconfig full-config gbm getaddrinfo getifaddrs glib gstreamer-1.0 harfbuzzicu inotify ipv6ifname kms large-config largefile libudev linuxfb medium-configminimal-config mremap neon nis opengl opengles2 openssl openvg pcre pngposix_fallocate precompile_header pulseaudio qpa qpa reduce_exports releaserpath shared small-config system-freetype system-jpeg threadsafe-cloexecuse_gold_linker zlib

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

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

  Using sanitizer(s)...... none

  Using C++ standard ..... c++11

  Using gold linker....... yes

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

  Using PCH .............. yes

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

  Target compiler supports:

    Neon ................. yes

 

Qt modules andoptions:

  Qt D-Bus ............... yes (linked todbus-1)

  Qt Concurrent .......... yes

  Qt GUI ................. yes

  Qt Widgets ............. yes

  Large File ............. yes

  QML debugging .......... yes

  Use system proxies ..... no

 

Support enabledfor:

  Accessibility .......... yes

  ALSA ................... yes

  CUPS ................... no

  Evdev .................. yes

  FontConfig ............. yes

  FreeType ............... yes (system library)

  Glib ................... yes

  GStreamer .............. yes (1.0)

  GTK theme .............. no

  HarfBuzz ............... yes (bundled copy)

  Iconv .................. no

  ICU .................... yes

  Image formats:

    GIF .................. yes (plugin, usingbundled copy)

    JPEG ................. yes (plugin, usingsystem library)

    PNG .................. yes (in QtGui, usingbundled copy)

  libinput................ no

  Logging backends:

    journald ............... no

    syslog  ............... no

  mtdev .................. no

  Networking:

    getaddrinfo .......... yes

    getifaddrs ........... yes

    IPv6 ifname .......... yes

    libproxy.............. no

    OpenSSL .............. yes (loadinglibraries at run-time)

  NIS .................... yes

  OpenGL / OpenVG:

    EGL .................. yes

    OpenGL ............... yes (OpenGL ES 2.0+)

    OpenVG ............... yes-auto

  PCRE ................... yes (bundled copy)

  pkg-config ............. yes

  PulseAudio ............. yes

  QPA backends:

    DirectFB ............. no

    EGLFS ................ yes

      EGLFS i.MX6 ........ yes

      EGLFS i.MX6 Wayland. no

      EGLFS EGLDevice .... no

      EGLFS GBM .......... yes

      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 ............... yes (plugin, usingbundled copy)

    TDS .................. no

  tslib .................. no

  udev ................... yes

  xkbcommon-x11........... no

  xkbcommon-evdev......... no

  zlib ................... yes (bundled copy)

 

 

NOTE: Qt is usingdouble 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.

 

Qt is nowconfigured for building. Just run 'make'.

Once everythingis built, you must run 'make install'.

Qt will beinstalled into /QtInstall

 

Prior toreconfiguration, make sure you remove any leftovers from

the previous build.

需要确保opengl的选项是yes,否则无法运行QtQuick程序。

6、 编译Qt。直接运行make,这个过程会出现一些错误,需要根据提示更改源码,或安装必要的软件,编译时间,不同的机器性能会有所差别,我的电脑编译一次大约需要一下午。

7、 安装Qt到配置目录。直接运行make install,执行完成后,会在配置路径下生成移植的Qt,内容如下:

8、 移植Qt。将生成的Qt目录直接拷贝到文件系统目录下,同时把sysroot下的icu相关的库文件拷贝到文件系统的lib目录下,因为Qt程序依赖icu库。拷贝完成后并不能直接运行Qt程序,还需要配置环境变量。我的配置脚本如下:

#!/bin/sh

export QTDIR=/QtInstall

exportQT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins

exportQT_QPA_PLATFORM=eglfs:fb=/dev/fb0

exportQT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event1

exportQT_QPAFONTDIR=$QTDIR/lib/fonts

exportQML2_IMPORT_PATH=$QTDIR/qml

export LD_LIBRARY_PATH=$QTDIR/lib:/usr/lib:/lib:$LD_LIBRARY_PATH

export PATH=$QTDIR/bin:/bin:/usr/bin:/usr/bin/qt5:$PATH

执行完该脚本,就可以运行程序了。比如:

./QtDemo –platform eglfs

也可以:

qmlscene QtDemo.qml –platform eglfs

qmlscene用于执行一个qml文件。

至此,手动移植Qt完成,这种方法的优势是,不在受限于内核版本,缺点是,每更换一次内核版本,就要重新编译一次Qt。

 

附录:烧写u-boot、kernel、rootfs脚本

#!/bin/sh

 

echo image burn begin!

 

ORGSDCARD=`fdisk -l | awk'{if(($2=="/dev/sdb:")||($2=="/dev/sdc:")||($2=="/dev/sdd:")||($2=="/dev/sde:"))print $2;}'`

 

SDCARD=${ORGSDCARD%?}

FIR=1

SEC=2

SDCARDFIR=$SDCARD$FIR

SDCARDSEC=$SDCARD$SEC

 

echo--------------------------------------

echo ORGSDCARD = $ORGSDCARD

echo SDCARD    = $SDCARD

echo SDCARDFIR = $SDCARDFIR

echo SDCARDSEC = $SDCARDSEC

echo--------------------------------------

echo '\n\n'

 

 

umount $SDCARDFIR

umount $SDCARDSEC

sync

dd if=/dev/zero of=$SDCARDbs=10M count=1

sync

 

fdisk $SDCARD << EOF

p

n

p

1

 

+20M

p

n

p

2

 

 

p

w

EOF

 

#上面的脚本对SD卡进行了分区

 

#烧写uboot

ddif=/home/yocto/nfs/board/u-boot.imx of=$SDCARD bs=512 seek=2

#对分区1进行FAT格式化

mkfs.vfat $SDCARDFIR

#挂载分区1

mount $SDCARDFIR ./mount_point1

#复制设备树文件到分区1

cp/home/yocto/nfs/board/imx6sx-sdb.dtb ./mount_point1

#复制内核代码到分区1

cp /home/yocto/nfs/board/zImage./mount_point1

#复制M4内核代码到分区1

#cp./imx6sx-image/hello_world.bin ./mount_point1

sync

#取消挂载

echo umount $SDCARDFIR !

umount ./mount_point1

sync

#对分区2进行EXT4格式化

mkfs.ext4 $SDCARDSEC

#挂载分区2

mount $SDCARDSEC ./mount_point2

#复制根文件系统到分区2

cp -a/home/yocto/nfs/board/rootfs/* ./mount_point2

sync

#取消挂载

echo umount $SDCARDSEC!

umount ./mount_point2

sync

echo image burn ok!


  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值