介绍

本文记录了QT交叉编译并移植到开发板的过程,并在虚拟机上用QTcreater 开发程序,到开发板上运行。其中重点解决了一些过程中的BUG和坑。

准备工作

1、一个ubuntu系统的电脑(或虚拟机)
2、arm64位开发板
3、QT源代码软件包 qt-everywhere-opensource-src-5.9.6.tar.xz
4、linaro交叉编译器
5、tslib
6、sqlite3
7、开发板根文件系统,其中包含了OpenGL ES3的库文件和头文件。

步骤

一、交叉编译环境搭建

直接参考文章linux_ubuntu_gcc-linaro-7.4.1交叉编译器安装
其中建议安装aarch64最新版交叉编译器

二、tslib和sqlite3的交叉编译与移植

直接参考文章
ARM40之TSLIB移植
移植SQLite3到ARM40-A5

三、交叉编译QT

1、首先解压qt开源源码后,编辑相关的qmake.conf文件,由于我用的是arm64位的开发板,所以编译的是linux-aarch64-gnu-g++这个 目录下的qmake.conf

vim ~/qt-everywhere-opensource-src-5.9.6/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf

参考以下代码

#
# qmake configuration for building with aarch64-linux-gnu-g++
#MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublibQMAKE_CFLAGS_RELEASE   += -O2 -march=armv8-a -mtune=cortex-a53      #指定处理器架构
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -mtune=cortex-a53include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)QMAKE_INCDIR = $$[QT_SYSROOT]/usr/include                             #指定sysroot头文件
QMAKE_LIBDIR = $$[QT_SYSROOT]/usr/lib                                 #指定sysroot库文件
QMAKE_LIBDIR += $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu              #指定sysroot库文件
QMAKE_LIBDIR += $$[QT_SYSROOT]/lib                                    #指定sysroot库文件QMAKE_INCDIR += /opt/tslib/include /opt/sqlite3/include   #指定tslib和sqlite头文件,需预编译
QMAKE_LIBDIR += /opt/tslib/lib /opt/sqlite3/lib           #指定tslib和sqlite库文件,需预编译QMAKE_CXXFLAGS += -ludev -lffi                                            #链接选项
QMAKE_LFLAGS += -Wl,-rpath-link,$$[QT_SYSROOT]/usr/lib                    #链接sysroot库文件
QMAKE_LFLAGS += -Wl,-rpath-link $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu  #链接sysroot库文件
QMAKE_LFLAGS += -Wl,-rpath-link $$[QT_SYSROOT]/lib                        #链接sysroot库文件QMAKE_INCDIR_OPENGL[_ES2] += \$$[QT_SYSROOT]/usr/include \$$[QT_SYSROOT]/usr/include/EGL \$$[QT_SYSROOT]/usr/include/GLES2 \$$[QT_SYSROOT]/usr/include/GLES3 \$$[QT_SYSROOT]/usr/include/KHR
QMAKE_LIBDIR_OPENGL[_ES2] += \$$[QT_SYSROOT]/usr/libQMAKE_INCDIR_EGL += $$QMAKE_INCDIR_OPENGL[_ES2]
QMAKE_LIBDIR_EGL += $$QMAKE_LIBDIR_OPENGL[_ES2]QMAKE_INCDIR_OPENVG += $$QMAKE_INCDIR_OPENGL[_ES2]
QMAKE_LIBDIR_OPENVG += $$QMAKE_LIBDIR_OPENGL[_ES2]
# QMAKE_LIBS_OPENGL[_ES2] += -lEGL -lGLESv2
QMAKE_LIBS_EGL          = -lEGL -lGLESv2
QMAKE_LIBS_OPENGL[_ES2]   = -lglapi -lGLESv2 -lEGL
#QMAKE_LIBS_OPENGL[_ES2] += -lbrcmEGL -lbrcmGLESv2# modifications to g++.conf
QMAKE_CC                = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
QMAKE_CXX               = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++
QMAKE_LINK              = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++
QMAKE_LINK_SHLIB        = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++# modifications to linux.conf
QMAKE_AR                = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-ar cqs
QMAKE_OBJCOPY           = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-objcopy
QMAKE_NM                = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-nm -P
QMAKE_STRIP             = /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-strip
load(qt_config)

上述代码主要注意以下几点
(1)、QT_SYSROOT为你开发板的根文件系统,你可以拷贝到电脑上或者挂载到电脑上。下面./configure时会指定这个目录。
(2)、配置sysroot,tslib,sqlite。opengl es2的头文件,库文件,以及编译时的符号和库文件。
(3)、指定交叉编译器路径

2、在qt-everywhere-opensource-src-5.9.6下面新建autoconf.sh文件,保存编译选项

#!/bin/sh
./configure \
-v \
-confirm-license \
-prefix /opt/qt5.9.6 \
-release \
-opensource \
-accessibility \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-tslib \
-sqlite \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-qt-freetype \
-opengl es2 \
-nomake examples -nomake tools \
-sysroot ~/sysroot \               //sysroot为开发板的根文件系统
-I ~/sysroot/usr/include \
-L ~/sysroot/usr/lib \
-L ~/sysroot/usr/lib/aarch64-linux-gnu \
-L ~/sysroot/lib

之后sudo chmod a+x autoconf.sh,使其可执行。

3、交叉编译QT

这部分是最恶心的部分,bug尤其多

(1)执行./autoconf.sh,进行编译。

这部分一般不会出错

(2)make -j4

这部分会有问题,会出现.h或者.so缺失问题,举例:如下所示:

In file included from /home/wadexu/debian_buster_renesas_OpenGL_for_QT_15.1/usr/include/sys/stat.h:446,from ../../mkspecs/linux-aarch64-gnu-g++/../linux-g++/qplatformdefs.h:75,from ../../mkspecs/linux-aarch64-gnu-g++/qplatformdefs.h:40,from global/qmalloc.cpp:40:
/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/include-fixed/bits/statx.h:48:10: fatal error: bits/statx-generic.h: 没有那个文件或目录48 | #include <bits/statx-generic.h>|          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

编译过程中报错,缺少<bits/statx-generic.h>。其实这个头文件是在sysroot中的,但是由于交叉编译器在搜索头文件路径时,会优先从自己的目录中搜索,导致引用的文件缺失。所以你需要在sysroot中,用find指令找到对应的头文件,并拷贝到/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/include-fixed/bits这个报错的目录中去。

这种情况大约会出现几十次,都以这种方式处理即可。

之后make执行完成,没有错误再出现(警告不用管)

(3)sudo make install

执行完成后,qt会安装到你~/sysroot/opt/qt5.9.6下面。把qt5.9.6拷贝到你开发板的/opt/下面即可。

四、开发QT程序

参考文章

linux下如何利用QtCreator编译ARM版本的Qt程序

注意以下几点

1、交叉编译QT程序,需要按照上述链接,指定构建环境、配置为交叉编译器,交叉编译后的gdb、交叉编译后的qt。
2、交叉编译的QT程序,选择为release模式,编译无报错即可。点击运行是运行不了的,因为你的电脑是X86的,引用arm64下面相关的.so会报错。

五、在开发板上运行QT程序

1、首先将电脑上交叉编译的qt5.9.6拷贝到开发板上,目录为/opt/qt5.9.6

2、配置开发板环境变量

sudo vim /etc/profile

export QTDIR=/opt/qt5.9.6
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH=$QTDIR/bin:$PATH
export PKG_CONFIG_PATH=$QTDIR/lib/pkgconfig/$PKG_CONFIG_PATH

source /etc/profile 使其生效

3、链接缺失的fonts文件到qt下面

ln -snf /usr/share/fonts/truetype/dejavu /opt/qt5.9.6/lib/fonts

4、将电脑上编译好的release文件夹拷贝到开发板上,以root身份执行可执行文件。

我的QT程序叫QtDemo,我将其拷贝到开发板上后,如下图所示:

执行./QtDemo即可在显示屏上出现自己的QT界面。

简单聊聊

想要在开发板上显示界面,你需要安装一个显示服务器,X11或者wayland这种都可以。如果想要用opengl es,需要开发板上包含gpu,并且有gpu厂家提供的opengl es 库文件以及头文件。这些在上述安装过程中,是已经安装好了的。

QT笔记--嵌入式QT交叉编译与移植(含OpenGL ES2)相关推荐

  1. Qt登录服务器验证,QT笔记:QT模拟网页交互过程中的token验证机制

    在平时上网时,我们登陆一些网站后,为了校验客户端的身份.保障数据的安全性,服务器会给浏览器发送一个token值,这个token值就是一张令牌,你可以把它看成一张通行证,有了它你才能对该网站进行提交数据 ...

  2. QT 笔记3 | Qt设计师使用 Qt创造器使用

    六. Qt设计师使用(designer) 案例1:使用设计师重构加法计算器 1 创建工程目录 mkdir Calculator2 2 进入工程目录,执行"designer"启动设计 ...

  3. Qt 笔记:Qt中的IO操作

    Qt中IO操作的处理方式 -Qt通过统一的接口简化了文件与外部设备的操作方式 -Qt中的文件被看做一种特殊的外部设备 -Qt中的文件操作与外部设备的操作相同 IO操作中的关键函数接口 -打开设备:bo ...

  4. opencv-3.4.3 交叉编译并且移植到高通820开发板(包括Qt 5.11.2部分交叉编译及移植),NEON OpenCV编译

    opencv-3.4.3 交叉编译并且移植到高通820开发板(包括Qt 5.11.2部分交叉编译及移植),NEON OpenCV编译 原文我是用有道笔记记录的,下面排版不是很好,可参看有道笔记原文:h ...

  5. 在Linux下搭建嵌入式Qt交叉编译环境[转载]

    Qt是嵌入式平台常用的GUI库,具有丰富的控件与开发资料.本文介绍如何在x86计算机上搭建ARM开发环境,并交叉编译ARM平台上运行的Demo. 准备 下载交叉编译器 下载Linaro公司推出的的ar ...

  6. 嵌入式Qt | 如何交叉编译Qt模块

    在硬件板卡提供商提供的嵌入式linux平台下的Qt环境中,很多时候会不太适合实际的开发场景: (1)可能一些Qt的模块不支持.这时候要么找厂家,要么自己编译. (2)在厂家提供的平台开发环境中,支持的 ...

  7. 基于arm的嵌入式QT开发(课程设计)

    一. 项目要求 配置QT5.7基于x86及arm 等两种CPU架构的调试及开发环境: 移植arm编译后的QT5.7及屏幕校准工具tslib1.4至CORTEX ARM9实验平台: 开发基于QT5.7的 ...

  8. Ubuntu下嵌入式Qt开发环境配置全攻略

    本文以友善之臂的Mini6410嵌入式开发板为目标板,介绍ubuntu 12.04系统下,配置嵌入式Qt开发工具的过程.本文中介绍的工具.大部分步骤和脚本来自开发板附带资料光盘,但其默认配置环境为老旧 ...

  9. 嵌入式linux配置qt,基于qt的嵌入式Linux开发环境搭建

    摘要:本文主要介绍在PC机上搭建基于QT的嵌入式开发环境,其中很多源文件都是开发板自带,需要相应资料的可以评论留下邮箱地址. 版本:交叉编译工具链:GCC 4.7.3  [gcc-linaro-arm ...

最新文章

  1. Golang1.13.x 解决go get 无法下载问题
  2. Linux系统的用户
  3. Windows下的定时任务
  4. Android(五)——dex文件动态调试
  5. CGGeometry基础
  6. eclipse 中 安装git 插件和使用git 插件
  7. python数据预处理
  8. 分表用到的一些函数/php mysql 前面补0
  9. 【FFmpeg小点记】AV_DISPOSITION_ATTACHED_PIC
  10. 运筹学 美国人在计算机上实现的四,运筹学试卷及答案
  11. SharePoint服务器端对象模型 之 使用CAML进展数据查询
  12. 消息队列(MQ) 企业服务总线(ESB)
  13. IDEA添加gitlab仓库并上传代码(无需使用任何git指令),报错Ask a project Owner or Maintainer to create a default branch解决方案
  14. 计算机ps2定义,软件硬件界面接口定义 bt656 硬件接口定义
  15. ipad分屏大小怎么调整_ipad软件应用推荐——学习笔记篇
  16. 正在使用赶牛! 赶牛,中国股民的微博客
  17. SEO优化(搜索引擎优化)
  18. PMCAFF | 小饭桌实战沙盘心得:积累不确定性中的确定性优势,一步步走向成功...
  19. 计算机应用基础作业一(答案),计算机应用基础作业一(答案).doc
  20. 硬件接口–内修篇:eDP

热门文章

  1. 各大公司电子类招聘题目精选
  2. 10月4日科技资讯|拼多多回应“商家发二选一微博”;Facebook 内部会议泄露音频;Rust 1.38 稳定版发布
  3. 开店攻略: 婴幼儿用品店导购培训,培训什么?
  4. JqGrid之指定单元格可编辑-yellowcong
  5. Linux下安装MySql总结
  6. javascript 美术库 改进2
  7. 关于天地图覆盖物-聚合点数据问题
  8. 在github上创建分支
  9. opencascade 获取鼠标选中对象
  10. 女生学计算机还是土木,女生适合读的十大工科专业:生物医学上榜,第十女生很少...