Qt5移植
qt版本5.9.9,平台类型:富瀚微旗下的眸芯MC6810E
由于我的设备是nvr,所以不需要移植tslib
,而这款芯片没有gpu
,所以平台插件选择了linuxfb
Qt源码配置
下载源码并解压后,开始进行配置。我的配置如下
./configure --prefix=/home/zhengzheng/QT/qt5.9.9 -xplatform linux-arm-gnueabi-g++ -release -opensource -confirm-license -shared -qt-zlib -qt-freetype -sql-sqlite -qt-libjpeg -qt-libpng -widgets -no-qml-debug -no-dbus -no-gif -no-iconv -no-opengl -no-cups -no-glib -no-rpath -no-avx -no-openssl -nomake tools -no-tslib -linuxfb -nomake examples -strip
-no-tslib -linuxfb
这两点需要特别注意
在官方文档 Qt for Embedded Linux 中介绍嵌入式中各种平台插件,其中有这样一句话
EGLFS is the recommended plugin for modern Embedded Linux devices that include a GPU.
如果我们移植的时候不主动选择linuxfb
,系统就会默认EGLFS
,我在第一次移植的时候没有好好看这个文档,然后在运行程序的时候,报了如下的错误
failed to start because it could not find or load the Qt platform plugin "xcb" in ""
,然后我就根据网上的提示,去找libqxcb.so
结果发现编译出来的目录没有这个插件。
而实际上我所用的这一款芯片没有GPU
,所以不能选择这个,我选择了linuxfb
,然而在没有加-no-tslib
配置选项时,运行Qt应用程序时,程序依然会报错找不到linuxfb
插件,可能是linuxfb
默认需要依赖tslib
修改编译配置文件
-xplatform linux-arm-gnueabi-g++
这是指定编译时使用的配置文件,我们需要修改对应的配置文件
修改qt-everywhere-opensource-src-5.9.9\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
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = arm-mol-linux-uclibcgnueabihf-gcc
QMAKE_CXX = arm-mol-linux-uclibcgnueabihf-g++
QMAKE_LINK = arm-mol-linux-uclibcgnueabihf-g++
QMAKE_LINK_SHLIB = arm-mol-linux-uclibcgnueabihf-g++
# modifications to linux.conf
QMAKE_AR = arm-mol-linux-uclibcgnueabihf-ar cqs
QMAKE_OBJCOPY = arm-mol-linux-uclibcgnueabihf-objcopy
QMAKE_NM = arm-mol-linux-uclibcgnueabihf-nm -P
QMAKE_STRIP = arm-mol-linux-uclibcgnueabihf-strip
load(qt_config)
配置完了以后就可以编译安装
make -j8 && make install
安装的位置就是配置中的--prefix=/
指定的目录
拷贝Qt库和平台插件(linuxfb)到开发板并修改开发板的系统环境变量
将相应的库拷贝到开发板相应的目录下,如果不知道是什么库,可以直接运行程序,然后系统就会提示缺少什么库。
然后需要修改系统配置文件,我选择的是/etc/profile
export LD_LIBRARY_PATH=/lib:/nfs/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=/home/zhengzheng/QT/qt5.9.9/plugins/
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920x1080:
指定平台插件目录是/home/zhengzheng/QT/qt5.9.9/plugins/
,之所以选择这个目录是因为这个目录是我安装qt
的目录,然后把plugins\platforms\libqlinuxfb.so
拷贝到/home/zhengzheng/QT/qt5.9.9/plugins/platforms
目录下,另外还需要创建/home/zhengzheng/QT/qt5.9.9/lib/fonts
目录文件。
运行Qt程序前需要初始化/dev/fb及相关的依赖
这个时候就可以运行qt5应用程序了,但是又遇到了一个问题
Failed to mmap framebuffer (Permission denied)
这个是因为我没有对mpp系统以及/dev/fb0
进行初始化,具体初始化的方式,参考芯片的SDK
就可以了
到此,程序基本上就可以运行了
我移植Qt5前后差不多花了一周的时间,显然是非常低效的,根本原因是我没有先查看Qt相应的文档,而是向无头苍蝇一样盲目移植,也不清楚Qt5的嵌入式系统已经由QWS切换到了QPA,浪费了太多时间。
如果你有什么问题,欢迎提出来,互相交流共同进步