IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【Linux】QT5移植到Linux ARM -> 正文阅读

[嵌入式]【Linux】QT5移植到Linux ARM

相关文章

《【TOOLS】ubuntu如何安装QtCreator》

1. 前言

QT 是一种跨平台 C++图形用户界面应用程序开发框架。它既可以开发 GUI 程序,也可用于开发非 GUI 程序,比如控制台工具和服务器。

在嵌入式 Linux 系统上,移植QT时通常需要支持tslisb,它是开源并常用的触摸屏库。下面会通过2个部分来介绍整个移植过程:tslisb移植qt移植

2. tslib-1.22的移植

2.1 tslib官方源码下载

最新tslib官方源码下载地址如下:
https://github.com/libts/tslib/releases

2.2 交叉编译tslib源码

  • 在编译tslib之前确认自己的电脑上已经安装了automake autoconf libtool libsysfs-dev软件

    sudo apt-get install automake autoconf libtool libsysfs-dev
    
  • 自动配置

    ./autogen.sh
    

    运行结果如下:
    在这里插入图片描述

  • configure做准备, 防止编译时出错。在当前目录运行如下命令:

    echo  "ac_cv_func_malloc_0_nonnull=yes"  > tmp.cache
    
  • configure配置tslib工程,命令如下:

    ./configure --host=arm-linux --cache-file=tmp.cache  --prefix=/opt/tslib1.22 CC=/opt/ToolChain/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc
    

    --prefix=/opt/tslib1.22 // 安装路径 (注意一定要写自己的安装路径)
    CC=...../arm-none-linux-gnueabihf-gcc // 指定编译器的绝对路径(注意:必须是绝对路径,否则报错) (注意一定是你交叉编译器的arm-linux-gcc的绝对安装路径)

    运行效果如下:
    在这里插入图片描述

  • 编译和安装

    1. make -j4 // -j4为4线程编译,可根据服务配置调整参数
    2. sudo make install // 将tslib安装到指定目录
    
  • 检查是否安装成功:如果出现bin,etc,include,lib这4个目录,如下图所示,说明交叉编译并安装tslib成功。
    在这里插入图片描述

3. QT5.15.2的移植

3.1 QT5.15.2官方源码下载

QT官方源码下载地址如下:
https://download.qt.io/archive/qt/5.15/5.15.2/single/
在这里插入图片描述

3.2 交叉编译QT

  • 将下载的qt-everywhere-opensource-src-5.7.0.tar.gz执行如下命令解压:

    tar -vxf qt-everywhere-src-5.15.2.tar.xz
    cd qt-everywhere-src-5.15.2
    
  • 修改交叉编译架构用到的信息:

    vim 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-none-linux-gnueabihf-gcc
      QMAKE_CXX               = arm-none-linux-gnueabihf-g++
      QMAKE_LINK              = arm-none-linux-gnueabihf-g++
      QMAKE_LINK_SHLIB        = arm-none-linux-gnueabihf-g++
      
      # modifications to linux.conf
      QMAKE_AR                = arm-none-linux-gnueabihf-ar cqs 
      QMAKE_OBJCOPY           = arm-none-linux-gnueabihf-objcopy
      QMAKE_NM                = arm-none-linux-gnueabihf-nm -P
      QMAKE_STRIP             = arm-none-linux-gnueabihf-strip
      load(qt_config)
    
  • 创建一个脚本文件,用于生成Makefile,在qt编译根目录执行命令:

    vim autoConfigure.sh
    

    输入下面内容并保存:

    #! /bin/sh
    
    ./configure \
    -v \
    -prefix /opt/qt-5.15.2 \
    -release \
    -opensource \
    -no-accessibility \
    -make libs \
    -xplatform linux-arm-gnueabi-g++ \
    -optimized-qmake \
    -pch \
    -qt-zlib \
    -qt-freetype \
    -tslib \
    -skip qtlocation \
    -no-iconv \
    -no-opengl \
    -no-sse2 \
    -no-openssl \
    -no-cups \
    -no-glib \
    -no-pkg-config \
    -no-separate-debug-info \
    -I/opt/tslib1.22/include -L/opt/tslib1.22/lib
    

    其中-prefix /opt/qt-5.15.2代表我们编译完QT5.15.2后要安装地址;-tslib代表QT对触摸板的支持,-I 和 -L后面分别为上面编译tslib的include和lib的安装目录。

    执行命令:

    chmod 777 qt.configure.sh
    ./autoConfigure.sh
    

    上述命令自动生成Makefile文件。

  • 编译和安装

    1. make -j4 // -j4为4线程编译,可根据服务配置调整参数
    2. sudo make install // 将tslib安装到指定目录
    
  • 我们切换到目标目录下看看是否安装成功:

    cd /opt/qt-5.15.2/
    ls
    

    如图所示:
    在这里插入图片描述
    /opt/qt-5.15.2/opt/tslib1.22 拷贝到开发板的文件系统中对应的目录中。

4. 设置QtCreator编译环境

首先参考这篇文章《【TOOLS】ubuntu如何安装QtCreator》安装QtCreator工具。

进入QtCreator开发环境,在菜单中选择Tools->Options,在弹出的对话框中,选择Kits,选择标签Compilers,按下图设置,选择手动添加C(GCC)和C++(G++)交叉编译器,如下图所示:
在这里插入图片描述
切换到Qt Versions标签,点击“Add”按钮,选择qmake,如图所示:
在这里插入图片描述
切换到Kits标签,点击“Add”按钮,将上面设置的CompilersQt Versions添加到新的配置,然后设置如下图所示:
在这里插入图片描述
保存以上的配置后,创建一个新的工程进行测试,创建时选择新添加的Kits:
在这里插入图片描述
验证是配置后的ARM交叉工具链编译,并且编译成功:
在这里插入图片描述

5. 配置开发板的环境

复制QtCreator使用的fonts字库到开发板的/opt/qt-5.15.2/lib/fonts目录:
在这里插入图片描述
配置开发板的环境变量:

vim /etc/profile

输入内容如下:

export QT_QPA_PLATFORM=linuxfb
export XDG_RUNTIME_DIR=/usr/lib/
export RUNLEVEL=3

更新环境变量:

source /etc/profile

备注:上面配置环境变量时,未对触摸屏设置。备注里面的配置其它博客参考过来,提供参考,未对下面的配置进行验证:

export TSLIB_ROOT=/opt/tslib1.4
export QT_ROOT=/opt/qt-5.7.0   
export TSLIB_TSDEVICE=/dev/input/event2
export TSLIB_TSEVENTTYPE=input         
export TSLIB_CONFFILE=/opt/tslib1.4/etc/ts.conf
export TSLIB_PLUGINDIR=/opt/tslib1.4/lib/ts    
export TSLIB_CONSOLEDEVICE=none                
export TSLIB_FBDEVICE=/dev/fb0             
export QWS_MOUSE_PROTO=tslib:/dev/input/event2
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/lib/
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           
export QT_QPA_GENERIC_PLUGINS=tslib

配置好开发板的环境变量后,在ARM开发板运行上面编译好的QT程序,结果如下:
在这里插入图片描述

6. 移植过程遇到的问题

问题1: 在开发板运行qt hello002应用程序时报错:

hello002: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.28' not found (required by /opt/qt-5.15.2/lib/libQt5Widgets.so.5)
hello002: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.28' not found (required by /opt/qt-5.15.2/lib/libQt5Core.so.5)

解决办法:
在开发板运行环境未找到对应版本的GLIBC,交叉编译工具有对应版本的库,将它拷贝到开发板:

benjamin@ubuntu:/opt/ToolChain/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf$ ll ./arm-none-linux-gnueabihf/libc/usr/lib/libstdc++*
lrwxrwxrwx 1 7720 7720       19 Nov 21  2020 ./arm-none-linux-gnueabihf/libc/usr/lib/libstdc++.so -> libstdc++.so.6.0.28*
lrwxrwxrwx 1 7720 7720       19 Nov 21  2020 ./arm-none-linux-gnueabihf/libc/usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.28*
-rwxr-xr-x 1 7720 7720 16701124 Nov 21  2020 ./arm-none-linux-gnueabihf/libc/usr/lib/libstdc++.so.6.0.28*
-rw-r--r-- 1 7720 7720     2394 Nov 21  2020 ./arm-none-linux-gnueabihf/libc/usr/lib/libstdc++.so.6.0.28-gdb.py
benjamin@ubuntu:/opt/ToolChain/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf$ cp ./arm-none-linux-gnueabihf/libc/usr/lib/libstdc++* ~/nfs_rootfs/usr/lib
lib/     libexec/
benjamin@ubuntu:/opt/ToolChain/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf$ sudo cp ./arm-none-linux-gnueabihf/libc/usr/lib/libstdc++* ~/nfs_rootfs/usr/lib/ -rfd

问题2: 在开发板运行qt hello002应用程序时报错:

QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed

解决办法一:

下载 http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz  
./configure CC=arm-none-linux-gnueabihf-gcc --prefix=$PWD/_install --host=arm-linux
make   
make install 

复制preloadable_libiconv.so到开发板的/lib目录,并配置在/etc/profile添加export LD_PRELOAD=/lib/preloadable_libiconv.so

解决办法二:

编译QT时不使用-no-iconv:
./configure  -no-iconv ...

问题3:移植libiconv的时候报错:

ENDS_ON_LIBINTL=1   -g -O2 -c xmalloc.c
In file included from progname.c:26:
./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function); did you mean ‘fgets’?
 1010 | _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
      | ^~~~~~~~~~~~~~~
make[2]: *** [Makefile:914: progname.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/home/benjamin/work/qt_project/libiconv-1.14/srclib'
make[1]: *** [Makefile:865: all] Error 2
make[1]: Leaving directory '/home/benjamin/work/qt_project/libiconv-1.14/srclib'
make: *** [Makefile:35: all] Error 2

解决办法:

vi libiconv-1.14/srclib/stdio.in.h

将698行的代码:_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");替换为:

#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif

问题4:在开发板运行qt hello002应用程序时报错:

qt.qpa.plugin: Could not find the Qt platform plugin "eglfs" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: linuxfb, minimal, offscreen, vnc.

Aborted

在执行qt程序时指定平台就可解决,如下:
解决办法一:

# hello002 -platform linuxfb

解决办法二:
/etc/profile末尾增加两句

export QT_QPA_PLATFORM=linuxfb

问题5:运行qt时不显示文字:

QFontDatabase: Cannot find font directory /opt/qt-5.15.2/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from https://dejavu-fonts.github.io/ for example) or switch to fontconfig.

解决办法:
复制QtCreator使用的fonts到开发板/opt/qt-5.15.2/lib/fonts目录:

benjamin@ubuntu:~/Qt/Tools/QtCreator/share/qtcreator/fonts$ ls
SourceCodePro-Bold.ttf  SourceCodePro-Regular.ttf
SourceCodePro-It.ttf    SourceCodePro.txt

问题6:

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

解决办法:
/etc/profile末尾增加两句

export XDG_RUNTIME_DIR=/usr/lib/
export RUNLEVEL=3
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:59:49  更:2021-07-28 08:00:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:41:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码