ZYNQ7000平台Linux文件系统工具buildroot下QT5.4的编译配置

来源:互联网 发布:网络诈骗的方式 编辑:程序博客网 时间:2024/06/06 01:46

近期调试Xilinx的zynq7000平台,需要进行图形界面开发,因此对QT进行编译配置。过程曲折,遇到一些问题,不过基本已解决。这里介绍的QT5未进行裁剪,因此占用空间比较多,本文宗旨是总结QT移植配置过程,裁剪部分可能以后会发文进行补充(其实我现在根本不清楚QT5的各个组件功能,不。敢。剪。尴尬


1. QT库编译


系统开发的文件系统采用的buildroot文件系统开发工具,因此这里就偷了个懒,直接在buildroot的menuconfig里添加了QT库。秉承与时俱进的原则,在可选的QT4.8.6和QT5.4.0中选择了后者,后来的编译配置过程真心后悔不已,这里提醒各位:升级需谨慎难过。当然,网上有很多采用QT源码进行移植和配置的文章,有兴趣各位可以借鉴,在之后的配置过程中也是参考了各位大神的文章才得以顺利进行,在这里谢一个先。


第一步:这里使用buildroot-2015.02版本(对,我就是这么怀旧!!!),在menuconfig里选择QT5,如图:




第二步:配置QT5,其实就是所有选项都选上,当然这会导致后续的某些问题,请原谅我单线程脑仁,我必须把这个错误的配置图贴上。




PS: buildroot-2015.02中支持的QT5的版本为5.4.0(可以查看buildroot源码的文件package/qt5/qt5.mk)。

前方有坑,捉急的同学可以直接跳到第三步。

目前QT5的最新版本为5.8.0,于是再次基于与时俱进的原则,将qt5.mk中的QT版本改为5.8.0,结果再次证明NO ZUO NO DIE,编译过程中出现以下错误:



退到QT5.6.0也是同样的问题,从打印信息中可见是在对QT5源码打补丁时出现了错误。buildroot确实是非常简单易用的工具,对下载的源码包中存在的BUG提供了一系列的补丁(QT5为例,patch文件可查看package/qt5中的各个子文件夹)。据我猜测,上述错误的原因是不同版本源码有所变动,补丁无法兼容所有版本(未经验证,真的是猜测得意,我才不会真的去找原因呢)。


因此,我还是老实编译QT5.4.0,不过有兴趣的同学可以下载buildroot-2017.02.1进行配置编译,其中支持QT5.6.2和QT5.8.0呦安静


第三步:make(话说这一步的等待时间绝对值得将它单独列为一步。。。尴尬


2. QT5程序运行调试


本章按照遇到的问题及解决方法进行说明,其中修改了menuconfig和QT的环境变量设置,这样顺便也说明了各个配置项的功能。因此内容看起来会比较混乱。下面很多参数配置都参考 qt 官网文档 http://doc.qt.io/qt-5/embedded-linux.html,下不赘述。


问题1:运行程序提示以下错误

This application failed to start because it could not find or load the Qt platform plugin "eglfs".
Available platform plugins are: directfbegl, directfb, linuxfb, minimal, offscreen.
Reinstalling the application may fix this problem.

按照打印信息,可见程序无法加载QT platform “eglfs”,但是有“directfbegl, directfb, linuxfb, minimal, offscreen”平台是可用的。这里使用的linuxfb平台,因此需要配置相应的环境变量(添加到文件/etc/profile中)

export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0

运行以下命令使其生效:

source /etc/profile

运行程序成功。

问题2:所有的字符(中英文)显示为方框


STEP1: 怀疑没有字库,查找文件系统,发现其中没有fonts文件夹,因此怀疑qt安装时未将字库文件拷贝到文件系统内。因此手动拷贝了fonts文件夹到文件系统目录/usr/lib下,添加以下环境变量并使能:

export QT_QPA_FONTDIR=/usr/lib/fonts

重启后字符仍显示为方框。

STEP2: 修改配置无效后,查看QT5的配置,在menuconfig中发现与字体有关的选项“fontconfig support”,取消选中,如图:



重新编译buildroot(部分编译的血泪史不想再说,劝各位还是完整地重新编译 buildroot 或者 QT5,不过大神请略过此句)后生成文件系统,发现其中 /usr/lib 文件夹下已经自动拷贝了 fonts 文件下(仿佛前方有光奋斗),按 STEP1 配置 QT_QPA_FONTDIR 并使能,可以显示英文字符。


问题3:可以显示英文,无法显示中文


显示英文后,发现无法显示中文,这里应该是缺少中文字库问题,参照以下文章解决:
http://blog.csdn.net/jiang_dlut/article/details/51829749 

问题4:使能 USB 鼠标


接入 USB 鼠标后,终端显示以下内容:



通过打印信息可见,内核已经识别了USB鼠标,但是 QT5 的应用程序界面没有鼠标图标。
参照 qt 官方文档以及 http://stackoverflow.com/questions/38838198/embedded-qt-mouse-pointer-not-showing-up。添加以下环境变量并使能解决:

export QT_QPA_FB_HIDECURSOR=0
export QT_QPA_GENERIC_PLUGINS=evdevmouse 
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event1

其中,/dev/input/event1 对应 USB 鼠标的设备。若不确定,可以通过以下方法进行检测:

1. 使用 cat /dev/input/eventX,依次打开读取 /dev/input/eventX 设备。
2. 移动 USB 鼠标,若有终端有数据输出,则为 USB 鼠标对应的 event 设备。

问题5:使能 USB 键盘


插上 USB 键盘后内核打印已经识别该设备(此处就不贴图示意了),但是 QT 程序不识别。具体原因与 USB 鼠标不识别原因类似。但是环境变量QT_QPA_GENERIC_PLUGINS 已经设置为使用 USB 鼠标的 event,因此采用应用程序添加输入参数的方式同时使能 USB 键盘。
具体操作参考 http://stackoverflow.com/questions/38439861/qt5-6-1-tslib-and-evdev-to-work-concurrently

通过以下参数使 QT 应用程序识别 USB 键盘。

./app_name -plugin eventkeyboard:/dev/input/event2

其中,/dev/input/event2 的识别方法与 USB 鼠标的 event 识别方式相同。


遗留问题:键鼠支持热插拔


0 0