zynq平台嵌入式Qt环境移植

之前已经在zynq的板子上面写好了framebuffer的驱动,并且运行了littlevl的gui。由于zynq的性能不错,为了缩短开发时间,还是移植一下qt来用。qt的移植过程并不复杂,主要还是要注意编译器和环境变量的配置。

交叉编译qt库

这次选用的是目前最新的LTS版本5.6.3,首先从官网上下载好源码,并且解压。

修改配置文件

编译所用的配置文件位置在qtbase/mkspecs文件夹下,这边会根据不同编译器使用不同的配置文件,由于我们使用的是以gcc-arm-linux-gnueabihf(这里hf表示hard float也就是说可以通过fpu进行浮点运算,当然需要处理器支持)编译器,所以叫我们新建一个文件夹linux-arm-gnueabihf-g++,并且将linux-arm-gnueabi-g++文件夹中的内容复制过来。随后打开qmake.conf文件,并修改文件内容如下:

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib
#默认输出方式
QT_QPA_DEFAULT_PLATFORM = linuxfb
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

#主要修改的就是以下编译器
# 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
load(qt_config)

configure生成makefile

将终端位置切换到qt源码目录下,使用以下语句生成Makefile,具体参数可以根据自己的需要删减。
其中需要说明一下的是prefix参数,这个路径决定了你一会儿make install的时候默认的安装路径。

xczhang@xczhang-ubuntu:~/sourcecode/qt-5.6.3$ ./configure -release -opensource -confirm-license -xplatform linux-arm-gnueabihf-g++ -prefix /usr/local/Qt5.6.3 -make examples

简单的核对一下输出的build option是否符合自己的需要。

Build options:
  Configuration .......... accessibility audio-backend c++11 c++14 c++1z clock-gettime clock-monotonic compile_examples concurrent cross_compile dbus enable_new_dtags evdev eventfd freetype full-config getaddrinfo getifaddrs harfbuzz iconv inotify ipv6ifname large-config largefile linuxfb medium-config minimal-config mremap no-pkg-config pcre png posix_fallocate precompile_header qpa qpa reduce_exports release rpath shared small-config threadsafe-cloexec use_gold_linker zlib 
  Build parts ............  examples libs
  Mode ................... release
  Using sanitizer(s)...... none
  Using C++ standard ..... c++1z
  Using gold linker....... yes
  Using new DTAGS ........ yes
  Using PCH .............. yes
  Using LTCG ............. no
  Target compiler supports:
    Neon ................. no

Qt modules and options:
  Qt D-Bus ............... yes (loading dbus-1 at runtime)
  Qt Concurrent .......... yes
  Qt GUI ................. yes
  Qt Widgets ............. yes
  Large File ............. yes
  QML debugging .......... yes
  Use system proxies ..... no

Support enabled for:
  Accessibility .......... yes
  ALSA ................... no
  CUPS ................... no
  Evdev .................. yes
  FontConfig ............. no
  FreeType ............... yes (bundled copy)
  Glib ................... no
  GStreamer .............. no
  GTK theme .............. no
  HarfBuzz ............... yes (bundled copy)
  Iconv .................. yes
  ICU .................... no
  Image formats: 
    GIF .................. yes (plugin, using bundled copy)
    JPEG ................. yes (plugin, using bundled copy)
    PNG .................. yes (in QtGui, using bundled copy)
  libinput................ no
  Logging backends: 
    journald ............... no
    syslog   ............... no
  mtdev .................. no
  Networking: 
    getaddrinfo .......... yes
    getifaddrs ........... yes
    IPv6 ifname .......... yes
    libproxy.............. no
    OpenSSL .............. no
  OpenGL / OpenVG: 
    EGL .................. no
    OpenGL ............... no
    OpenVG ............... no
  PCRE ................... yes (bundled copy)
  pkg-config ............. no 
  PulseAudio ............. no
  QPA backends: 
    DirectFB ............. no
    EGLFS ................ no
      EGLFS i.MX6 ........ no
      EGLFS i.MX6 Wayland. no
      EGLFS EGLDevice .... no
      EGLFS GBM .......... no
      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, using bundled copy)
    TDS .................. no
  tslib .................. no
  udev ................... no
  xkbcommon-x11........... no
  xkbcommon-evdev......... no
  zlib ................... yes (bundled copy)

出现一下内容了之后说明configure完成,可以准备编译了。

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /usr/local/Qt5.6.3

编译

最后使用make编译,接下来就是漫长的等待啦,喝杯茶一会儿就好了(1600x大概10分钟时间)。

xczhang@xczhang-ubuntu:~/sourcecode/qt-5.6.3$ make -j 12

安装

安装也是一个命令解决,注意之前设定的路径,有可能会需要root权限。

xczhang@xczhang-ubuntu:~/sourcecode/qt-5.6.3$ sudo make install

目标板环境配置

拷贝qt运行库

首先把之前编译生成的qt库库拷贝到自己的目标板子上,我这里还是拷贝到了/usr/local下。

配置环境变量

打开目标版/etc/profile,加入以下内容,主要是配置qt库的路径,还有输出设备。

export QTEDIR=/usr/local/Qt5.6.3
export LD_LIBRARY_PATH=/usr/local/Qt5.6.3/lib:$LD_LIBARAY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts

运行测试程序

之前编译的时候有把example一起编译进去,所以现在来运行几个例程测试一下。
《zynq平台嵌入式Qt环境移植》

配置交叉编译qt开发环境

一共修改三个地方的配置,compiles,qt version,kits。

compiles

首先修改编译器,如图所示,添加一个新的编译器,选择好编译器的路径,这里有一点特殊的地方,由于需要使用fpu来进行浮点计算,所以现在linker flag里面加入-mfloat-abi=hard -mfpu=vfpv3-d16,如果之前编译器没有选择gnueabihf那这里可以不加。
《zynq平台嵌入式Qt环境移植》

Qt Versions

接下来新增新的qt version,直接选择新编译出来的qmake文件就可以了。
《zynq平台嵌入式Qt环境移植》

kits

最后新建一个qt kits,修改devive type,compile,qt version。这边现在没有用到远程调试的功能,所以device和debugger先不配置。
最后保存目前的配置,将工程的kit选定为自己新建的就可以啦。
《zynq平台嵌入式Qt环境移植》

总结时间

经过以上配置qt的移植基本完成了,但是在没有opengl的情况下,qt quick不可用,也算是一大遗憾。此外,默认的控件样式非常丑,后续再想办法做一些修改吧。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注