QT移植Linux平台

1.1 QT简介

    这里对QT不做详细介绍,只介绍下QT的几个优势点,这也是为何采用QT作为后续Linux平台的GUI框架进行开发。

    QT核心的一点就是,一套代码,不同编译,就可以在不同平台上运行,不需要额外修改代码。它的几个优势在于:

  • 具有优良的跨平台性能。
  • QT是面向对象的。
  • QT具有丰富的API。
  • QT支持2D/3D渲染,并且支持OpenGL
  • QT拥有大量的开发文档。

   以上就是QT的几点优势,整体而言开发效率上会高于其他GUI的框架。

1.2 QT编译

         QT的编译包括两部分,一部分是需要移植平台的交叉编译链安装,一部分是QT源码在移植平台的交叉编译链下进行编译安装。具体过程如下步骤(后续开发人员可按此步骤进行编译):

        ① 需要一个linux编译平台,鉴于后续开发,最好自己安装一个虚拟机,在虚拟机上安装linux系统(我这里安装的是ubuntu20.04.1桌面版 ubuntu-20.04.1-desktop-amd64.iso), 由于不同版本存在差异,QT源码在不同的版本下编译可能存在错误,因此建议直接安装此版本的系统,后续所有过程建议按描述来(避免踩同样的坑)

       ② 安装对应嵌入式平台的交叉编译链,一般厂家都会提供交叉编译链包,把厂家提供的编译链包拷贝到虚拟机里,进行安装即可,如sigmastar提供的交叉编译包解压后无需安装,直接把交叉编译链的路径加到PATH中即可,具体不再描述。

      ③ 下载QT源码,QT源码版本很多,我这里用的是5.12.8版本,下载完后,解压出来,然后在qtbase->mkspecs->下复制一个交叉编译文件夹,可以参考其他的即可,然后在修改qmake.conf文件,把交叉编译写成②步骤安装的交叉编译即可,如:QMAKE_CC = arm-linux-gnueabihf-gcc

     ④然后回到QT源码的根目录,通过以下命令生产makefile文件,

./configure -prefix  /opt/arm_linux_gnueabihf_gcc_qt5.12.8  -release -opensource -confirm-license -static  -shared -platform linux-g++  -xplatform arm-linux-gnueabihf-g++  -qt-freetype -no-pch -no-avx -no-openssl -no-cups -no-dbus -no-opengl -no-glib  -no-xcb  -no-eglfs  -no-pkg-config -no-iconv -skip qtwebchannel -skip qtcanvas3d -nomake examples

     要注意的是,标红的两个,一个是最后安装目录,一个是步骤③新建的交叉编译文件夹名称

    ⑤生成makefile文件后,先make clean一下,再make ,如果有编译错误,按错误进行修改即可,ubuntu20+qt5.12.8目前是没有报编译错误,所以建议按这个来,否则处理编译错误会很麻烦。

    ⑥make成功后,再make install ,最后会安装再步骤④中指定的安装目录。

    通过以上6个步骤,既可以完成整个QT的交叉编译。

1.3 QT Creator安装

      QT Creator是QT的开发软件,即后续所有的QT开发需要在该软件上进行,包括编译打包也是在QT Creator上进行,该软件安装相对简单,目前试验安装的是qtcreator4.4.1版本,主要是安装完后,需要配置构建编译参数,具体如下:

     ① 进入软件,选择工具-选项。

QT移植Linux平台

 

     ②先设置编译器,选择添加新的GCC,然后编译器路径选择2.2节步骤②中交叉编译链路径下的对应交叉编译GCC工具,完成后,同样的方式添加G++。

QT移植Linux平台

       ③ 然后添加QT版本,同样是选择添加,注意这里选择的是2.2节中QT编译后安装的路径下的qmake,切记不能选择错误,因为编译工具和QT版本是对应的,即用的交叉编译工具,对应的qmake版本也需要是交叉搬移工具生成的。

QT移植Linux平台

 

         ④ 最后是新建构建套件,按如下图选择之前新建的编译工具和QT版本即可。

QT移植Linux平台

1.4 QT移植验证

     完成2.1~2.3节的工作后,即完成了QT移植的前期编译打包工作,后面就是具体移植到对应Linux平台的,进行验证。

     首先在QTcreator上新建一个项目,随便画一个控件,构建编译一下,生产一个自己的demo程序用来验证用。

QT移植Linux平台

         其次,启动需要移植平台的板子,为了快速验证,先启动板子自带的framebuffer demo或者app,这里说明一下,QT5在linux下是通过framebuff来进行绘图的,而且是输出到显示屏上,需要初始化vo输出等,所以为了方便起见,先跑一个板子自己的程序保证显示是正常的后,再暂停或退出程序,再换QT程序验证。

       在确保板子vo输出正常的情况下,通过挂载,将2.2节中步骤⑥生产的文件夹挂载到设备上,然后配置QT的环境变量

       export  QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0

       export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/nfs/bulid_libs/arm-sigma_qt5.12.8/lib

       export QT_QPA_PLATFORM_PLUGIN_PATH=/nfs/bulid_libs/arm-sigma_qt5.12.8/plugins

       export  QT_PLUGIN_PATH=/nfs/bulid_libs/arm-sigma_qt5.12.8/plugins

       export  QT_QPA_FONTDIR=/lib/fonts

       export  QT_DEBUG_PLUGINS=1

       这里说明下fonts是字体所在的目录,按实际配置,pluginsQT的插件,libQT库(可按需加载)

       最后,运行刚自己构建的小demo,看输出是否正常,如下图所示,显示与设计一致,说明整体QT移植完成。后续就是具体开发内容。

       QT移植Linux平台