QT5.9.6移植到ARM平台

目录

        • 前言
        • 移植准备
        • 移植步骤
          • 1.准备相关软件和源码
          • 2.安装arm交叉编译器arm-2014
          • 3.交叉编译tslib
          • 4.交叉编译qt
        • 常见错误及解决
        • 参考链接

前言

最近做嵌入式的课程设计,需要将QT5移植到ARM平台上,我使用的教学平台所用的CPU为Samsung Exynos 4412,ARM Coretex-A9 四核,主频为1.4GHz,Exynos 4412 Block Diagram。本文以此平台为例,记录将QT5.9.6移植到该平台的过程。

移植准备

  • 目标硬件平台:可运行linux的arm设备
  • 目标软件平台:arm_linux最小系统(linux3.0内核)
  • 开发机硬件平台:x86/x64PC机
  • 开发机软件平台:Ubuntu16.04的虚拟机+QtCreator

移植步骤

1.准备相关软件和源码
  • QT5.9.6源码(qt-everywhere-opensource-src-5.9.6.tar.xz):
    https://download.qt.io/archive/qt/5.9/5.9.6/single/qt-everywhere-opensource-src-5.9.6.tar.xz

  • ARM交叉编译工具:arm-2014.05-29-arm-none-Linux-gnueabi-i686-pc-linux-gnu.tar.bz2
    https://pan.baidu.com/s/1mgyYfos

  • tslib(用于触摸屏的一个库):在Ubuntu中输入命令即可下载
    #git clone https://github.com/kergoth/tslib.git

  • ubuntu换源(可选):ubuntu自带的源速度较慢,由于后面要下载东西,为了速度可以换成阿里源
    Ubuntu换阿里源

2.安装arm交叉编译器arm-2014
  • 将准备好的源码包用tar命令解压到/usr/local/arm目录

    sudo mkdir -p /usr/local/arm
    sudo bunzip2 arm-2014.05-29-arm-none-Linux-gnueabi-i686-pc-linux-gnu.tar.bz2 #解压得到.tar文件
    sudo tar xvf arm-2014.05-29-arm-none-Linux-gnueabi-i686-pc-linux-gnu.tar /usr/local/arm/
    
  • 配置环境变量

  • 进入用户目录:cd ~/

  • 打开.bashrc文件:sudo gedit .bashrc

  • 在文件末尾加上:export /usr/local/arm/arm-2014.05/bin:$PATH

  • 保存退出,在命令行里更新:source .bashrc

  • 检查是否配置成功:arm-linux-gnueabi-gcc -v

3.交叉编译tslib
  • 使用git命令下载最新版本tslib

    git clone https://github.com/kergoth/tslib.git

  • 下载编译需要的依赖库:

    sudo apt-get install automake
    sudo apt-get install autogen
    sudo apt-get install autoconf
    
    sudo apt-get install libtool
    sudo apt-get install gzip
    sudo apt-get install g++
    
  • 将ubuntu用户切换为root用户:
    设置root用户的密码:sudo passwd root
    切换到root用户:su root

  • 配置交叉编译工具环境变量:之前配置的是用户目录的环境变量,现在使用的是root,需要再命令行再配置一下,关闭终端就失效
    export PATH=/usr/local/arm/arm-2014.05/bin:$PATH

  • 编译tslib

cd tslib #进入目录
./autogen.sh #执行脚本
#生辰makefile
./configure --host=arm-none-linux-gnueabi ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=/media/inand_ext4_1/tslib
make #生成
make install #安装
4.交叉编译qt
  • 解压qt源码包:

    cd ~/Desktop #进入源码所在目录
    xz -d  qt-everywhere-opensource-src-5.9.6.tar.xz #解压为.tar文件
    tar xvf qt-everywhere-opensource-src-5.9.6.tar #解压到当前目录
    cd qt-everywhere-opensource-src-5.9.6/
    gedit ./qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf   #编辑qmake.conf
    
  • 修改qmake.conf文件内容:

    #
    # qmake configuration for building with arm-none-linux-gnueabi-g++
    #
    
    MAKEFILE_GENERATOR      = UNIX
    CONFIG                 += incremental
    QMAKE_INCREMENTAL_STYLE = sublib
    
    QT_QPA_DEFAULT_PLATFORM = linuxfb                 #指定Qt显示驱动方式
    QMAKE_CFLAGS_RELEASE   += -O2 -march=armv7-a      #指定处理器架构
    QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a    
    
    include(../common/linux.conf)
    include(../common/gcc-base-unix.conf)
    include(../common/g++-unix.conf)
    
    QMAKE_INCDIR += /media/inand_ext4_1/tslib/include    #指定头文件,需预编译
    QMAKE_LIBDIR += /media/inand_ext4_1/tslib/lib          #指定库文件,需预编译
    
    # modifications to g++.conf
    QMAKE_CC                = arm-none-linux-gnueabi-gcc
    QMAKE_CXX               = arm-none-linux-gnueabi-g++
    QMAKE_LINK              = arm-none-linux-gnueabi-g++
    QMAKE_LINK_SHLIB        = arm-none-linux-gnueabi-g++
    
    # modifications to linux.conf
    QMAKE_AR                = arm-none-linux-gnueabi-ar cqs
    QMAKE_OBJCOPY           = arm-none-linux-gnueabi-objcopy
    QMAKE_NM                = arm-none-linux-gnueabi-nm -P
    QMAKE_STRIP             = arm-none-linux-gnueabi-strip
    load(qt_config)
    
  • configure编译配置:

    cd qt-everywhere-opensource-src-5.9.6/ #进入源码目录
    sudo ./configure \
       -prefix /opt/qt5.9.6 \
       -confirm-license \
       -opensource \
       -shared \
       -release  \
       -make libs \
       -xplatform linux-arm-gnueabi-g++ \
       -optimized-qmake \
       -pch \
       -linuxfb \
       -qt-libjpeg \
       -qt-libpng \
       -qt-zlib \
       -no-opengl \
       -no-sse2 \
       -no-openssl \
       -no-cups \
       -no-glib \
       -no-dbus \
       -no-xcb \
       -no-separate-debug-info \
       -make examples -nomake tools -nomake tests -no-iconv \
       -tslib \
       -I/media/inand_ext4_1/tslib/include \
       -L/media/inand_ext4_1/tslib/lib \
       -recheck-all
    

    执行没错误的话,就可以进行下一步make了

  • configure配置中可能出现的错误:
    arm-none-linux-gnueabi-g++ : not found:找不到arm编译器

  • 查看环境变量是否配置了:
    echo $PATH,如果没有就参照上面添加环境变量

  • 如果有环境变量,但是还是找不到,并且到所在目录执行arm-none-linux-gnueabi-g++提示找不到或者没有这个文件,那就是缺少32位库,执行sudo apt-get install g++-multilib即可。

  • 编译和安装

    make -j 4 #多线程编译
    make install #make没出错的话,就可以执行make install安装了
    

常见错误及解决

  1. 错误:环境变量配置正确,目录下也能找到arm交叉编译工具的编译器,执行编译时却仍然报找不到编译器的错误。
    解决方案:交叉编译工具是32位的,在64位系统上运行时会缺少32位系统运行库。因此解决方案就是安装32位运行库。百度即可。

  2. 错误:编译QT子模块时错误。

    roject ERROR:Unknown module(s) in QT: quick-private 
    make[2]: *[sub-quickwidgets-make_first-ordered] 错误 3 
    make[2]:正在离开目录 
    
    /home/jason/work/qt-everywhere-opensource-src-5.3.0/qtdeclarative/src' 
    make[1]: ***[sub-src-make_first] 错误 2 
    make[1]:正在离开目录
    
    /home/jason/work/qt-everywhere-opensource-src-5.3.0/qtdeclarative’ 
    make: *[module-qtdeclarative-make_first] 错误 2
    

    解决方案:quickwidgets模块依赖quick模块,去掉-no-opengl即可。

  3. 错误:嵌入式平台上运行程序时报错:This application failed to start because it could not find or load the Qt platform plugin “linux #eglfs” in “”
    解决方案:可能是没有配置环境变量,因此配置QT以及tslib的环境变量。

  4. 错误:Configure步骤生成make时报错:

    WARNING: gperf is required to build QtWebEngine.
    
    WARNING: bison is required to build QtWebEngine.
    
    WARNING: flex is required to build QtWebEngine.
    
    WARNING: host pkg-config not found
    
    ERROR: The OpenGL functionality tests failed!
    You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
    QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.
    

    解决方案:可能是没有正确安装编译QT所需的依赖库,安装QT的依赖库:

    sudo apt-get install bison build-essential gperf flex ruby python libasound2-dev libbz2-dev libcap-dev libcups2-dev libdrm-dev libegl1-mesa-dev libgcrypt11-dev libnss3-dev libpci-dev libpulse-dev libudev-dev libxtst-dev gyp ninja-build libglu1-mesa-dev libfontconfig1-dev libx11-xcb-dev libicu-dev
    
  5. 错误:安装QT依赖库时出现依赖版本过高的问题:Depends: libcups2 (= 2.1.3-4) but 2.1.3-4ubuntu0.5 is to be installed
    原因:ubuntu自带的安装包管理无法解决,需要安装aptitude管理器进行处理
    解决方案:安装aptitude代替apt进行依赖库的安装即可。

  6. 错误:Configure步骤报错:ERROR: Feature 'tslib' was enabled, but the pre-condition 'libs.tslib' failed.
    解决方案:tslib要预先编译好并指定include路径和lib路径,否则在生成的makefile中找到对应的库。

  7. 错误:编译QT时报错:arm-none-linux-gnueabi-g++:not found
    原因:可能是没有设置Arm交叉编译工具链的环境变量,也可能是问题1
    解决方案:设置环境变量PATH=/usr/local/arm/arm-2014.05/bin:$PATH

  8. 错误:在实验平台上运行Qt程序,无法显示文字。
    原因:没有拷贝ubuntu的字体包到arm-qt的lib/fonts目录,没有字体文件。
    解决方案:拷贝/usr/share/fonts/truetype/ubuntu-font-family下的字体文件到/opt/arm-qt5.9.6/lib/fonts目录下。
    注意:这里的/opt/arm-qt5.9.6/是我的arm-qt解压的路径,因该适当变通。

  9. 错误:实验平台运行Qt程序,无法显示中文。
    原因:没有中文字库。
    解决方案:下载qt支持的字库,安装到arm-qt的lib/fonts目录下,并设置环境变量
    参考链接:Qt在嵌入式系统中显示中文的方法

  10. 错误:移植QT5后,触摸屏和显示位置不同
    原因:首先排除触摸屏本身的问题,运行校准程序校准后仍然触屏位置与显示位置错误,经实验发现是刚好触摸位置和显示位置是上下颠倒的。因此应该是QT坐标系与触摸屏坐标系不一致造成的。
    解决方法:使用QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS来调整触摸屏,使用这个参数可以旋转坐标轴和反转x轴或y轴,由于我的问题是上下颠倒,因此反转y轴即可,配置为/dev/input/event3:invert(注意: 在你的实验设备上,并不一定是event3,请自行修改)
    参考链接:QT5移植嵌入式触摸屏,点击位置和显示位置不对解决方法

参考链接

  • 交叉编译Qt5.9.6

  • Qt for ARM_Linux环境搭建-Qt5.7+iTop4412嵌入式平台移植

  • QT安装

  • Ubuntu 14.04系统下安装和编译QT 5.9.2库(桌面版/ARM嵌入式IMX6版)

你可能感兴趣的:(环境搭建,QT,ARM)