查看: 106|回复: 0

ZedBoard学习手记(九) 在ZedBoard上运行QT图形软件

[复制链接]

主题

好友

3932

积分

版主

  • TA的每日心情
    无聊
    2015-8-17 09:38
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-1-27 16:53:38 |显示全部楼层
    在Zynq平台上运行QT其实与PC无异,都需要相应的执行环境,只不过PC上的QT Lib可以使用QT SDK自动安装配置,而Zynq平台上的QT Lib则需要手动安装。另外,我们自己编写的代码只需要使用Xilinx交叉编译器进行一次编译就能在ZedBoard上执行,而QT代码则需要先由QMake进行配置,之后再用交叉编译器编译。因此,想让QT开发的应用程序在ZedBoard上运行,首先就要编译一个适合Zynq平台的QT库。
    其实操作方法已经在Xilinx Wiki中介绍了,但跟着Xilinx的介绍走一通可能都不知道自己在干什么(兔子一开始就是这样)。这里我就给大家一步骤讲解一下。原始资料请见Wiki:
    https://wiki.xilinx.com/zynq-base-trd-qt
    Xilinx已经提供了一个QT Lib源码包和相关的配置文件,不过是4.7版的
    兔子使用的4.8.3版本可以在QT官网上下载:
    https://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-4.8.3.tar.gz
    一、安装QT Lib
    之前我们已经配置好了交叉编译环境使用的环境变量PATH和CROSS_COMPILE,而为了简便操作,还可以再设置几个环境变量。
    export ZYNQ_QT_BUILD=/path/to/qt/build
    export ZYNQ_QT_INSTALL=/path/to/qt/install
    export PATH=$ZYNQ_QT_INSTALL/bin:$PATH
    ZYNQ_QT_BUILD指向QT源码解压后的目录,ZYNQ_QT_INSTALL则指向QT Lib的安装目录,以后要编译QT工程,都需要用到安装目录中的程序,因此在PATH中添加了一条指向QMake等程序所在的路径。按需要替换等号后面的路径,比如兔子的安装路径是/arm/qt/qt-lib/。
    之后将qt-everywhere-opensource-src-4.8.3.tar.gz解压到ZYNQ_QT_BUILD指向的目录中,把qt_build_src.tar里的qmake.conf配置文件复制到qt-everywhere-opensource-src-4.8.3/mkspecs/qws/linux-arm-gnueabi-g++目录下,这个文件用来告知QMake应该用哪个编译器来编译QT工程。然后对QT进行配置:
    ./configure
    -embedded arm
    -xplatform qws/linux-arm-gnueabi-g++
    -little-endian
    -opensource
    -host-little-endian
    -confirm-license
    -nomake demos
    -nomake examples
    -prefix $ZYNQ_QT_INSTALL
    虽然QT Lib是在本地进行交叉编译的,这些配置选项则根据目标平台而定,其中-embedded arm一项表示目标设备为ARM核心设备,-prefix $ZYNQ_QT_INSTALL则将QT Lib安装到指定的目录里。
    兔子在看到这个选项后当即想到能不能在Xilinx其他系列的FPGA上移植QT。很不幸的是,目前QT似乎并不支持MicroBlaze或NIOS II这样的软核,虽然也有资料显示可以实现,但应该需要不小的工作量。还有待进一步研究啊。
    配置完成后进行编译:
    make
    编译好了就可以进行安装(安装需要在root权限下进行):
    make install
    之后将Xilinx交叉编译器中的基础C++库复制到QT的安装目录下:
    cp -P /path/to/cross/compiler/arm-xilinx-linux-gnueabi/libc/usr/lib/libstdc++.so* $ZYNQ_QT_INSTALL/lib
    这样就位Zynq平台手动安装了一个QT Lib。
    二、为ZedBoard制作预编译QT库镜像
    安装好QT Lib后,已经可以直接编译QT工程了,但是想要在ZedBoard上运行还需要将所需的库文件拷贝到ZedBoard上,那么为什么要把它做成镜像文件呢?
    兔子的理由是这样的:以Digilent出厂默认的Demo系统为例,该系统的rootfs是通过在内存中虚拟出一个8M-Byte大小的空间并加载固定的镜像文件来实现的,这个rootfs十分小巧,但缺点是空间不足。数十兆的QT支持库无法装入这个小镜像里,即使可以也会占用大量内存。因此只要将其做成镜像的形式,就可以保存在SD卡中,通过mount指令装载,节省了内存资源。
    Xilinx已经提供了制作镜像的方法(安装需要在root权限下进行):
    cd $ZYNQ_QT_BUILD
    dd if=/dev/zero of=qt_lib.img bs=1M count=80
    mkfs.ext2 -F qt_lib.img
    chmod go+w qt_lib.img
    mount qt_lib.img -o loop /mnt
    cp -rf $ZYNQ_QT_INSTALL/* /mnt
    chmod go-w qt_lib.img
    umount /mnt
    这个qt_lib.img就是我们需要的QT运行库了。
    三、编译QT工程
    在上一篇博客中,我们已经建立好了一个QT工程,名为HelloQT。在交叉编译之前,建议复制一份工程文件夹,以防交叉编译后,QT Creator无法再运行该工程。
    这里我们将复制得到的文件夹命名为zed_complie,保证ZYNQ_QT_INSTALL和PATH变量已经配置正确(可以按之前讲的方法把两个export命令加入到开机自动运行中),在这个文件夹下,依次执行下列指令:
    qmake –project
    qmake
    make
    完成后会生成一个与文件夹同名的可执行文件,在这里就叫zed_complie。和拷贝到SD卡中,在ZedBoard里装载qt_lib.img。要注意的是,这个镜像最好装载到与本地安装目录相同的路径下,即ZYNQ_QT_INSTALL指向的目录,兔子就把这个镜像装载到/arm/qt/qt-lib/文件夹下(mmcblk0p2是SD卡的分区)。
    mount /dev/mmcblk0p2 /mnt/
    mount /mnt/qt_lib.img /arm/qt/qt-lib/
    这样一来,就可以运行QT程序了。-qws指令用来建立一个运行QT软件必须的QWS Server,这是由QT的运行机制决定的,软件会从/arm/qt/qt-lib/文件夹里调用QT运行库。
    /sdcard/zed_compile –qws
    再根据兔子之前讲的修改rootfs镜像的方法,便能够实现ZedBoard上电自动加载QT库并运行我们自己开发的应用软件。
    深入思考:
    1.能否通过修改环境变量来改变调用QT运行库的位置?
    2.如何为Linaro系统编译QT库,并在Linaro系统下运行QT软件?
    这两个问题就留给大家思考吧,希望研究出结果的朋友不吝分享啊。
    最后发一个ZedBoard上的运行效果图:
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条

    手机版|电路城

    GMT+8, 2019-9-17 13:49 , Processed in 0.096006 second(s), 14 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部