全志H5,NanopiKP1lus移植QT5.12记录

移植步骤

  • 机器环境
  • 下载QT5.12.0源码
  • 安装交叉编译器
  • 修改qmake.conf文件
  • 配置编译选项
    • qt5的configure选项说明
      • 基本配置选项
      • 编译器和链接器选项
      • 功能模块配置
      • 第三方库集成
      • 注意事项
  • 配置过程报错解决
  • 配置完成
  • 编译过程报错解决
  • 编译完成
  • 将arm-qt文件夹传送到开发板
  • 配置板子环境变量
  • 运行自带例子检验
  • 宿主机QT arm环境开发
  • 程序验证
  • 移植完毕

机器环境

主机Linux版本:Ubuntu24.04
板卡硬件:NanoPi K1 Plus,全志H5芯片,ARMv8架构,aarch64指令集,屏幕为1.96ST7789V屏幕(已移植好framebuffer驱动)

下载QT5.12.0源码

官方下载地址:https://download.qt.io/archive/qt/5.12/
下载qt-everywhere-src-5.12.0.tar.xz源码包
下载qt-opensource-linux-x64-5.12.0.run安装文件用于主机linux环境QT开发

安装交叉编译器

Nanopi_K1_Plus官方wiki教程里有链接,自行下载:
开发板使用教程wiki:https://wiki.friendlyelec.com/wiki/index.php/NanoPi_K1_Plus/zh
内核编译教程wiki:https://wiki.friendlyelec.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B/zh
官方推荐编译器:gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz下载地址:https://download.friendlyelec.com/nanopineo2
下载交叉编译器gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz,然后解压编译器:

sudo mkdir -p /opt/FriendlyARM/toolchain
sudo tar xf gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz -C /opt/FriendlyARM/toolchain/

将编译器的路径加入到PATH中,用vi编辑vi ~/.bashrc,在末尾加入以下内容:

$ export PATH=/opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin:$PATH
$ export GCC_COLORS=auto

执行一下~/.bashrc脚本让设置立即在当前shell窗口中生效,注意"."后面有个空格:

$ . ~/.bashrc

安装完成后,你可以快速的验证是否安装成功:

$ aarch64-linux-gnu-gcc -v
gcc version 6.3.1 20170109 (Linaro GCC 6.3-2017.02)

修改qmake.conf文件

将之前下载的qt源码qt-everywhere-src-5.12.0.tar.xz进行解压,我的解压目录如下:/home/image/work/nanopi-k1/qt,将解压目录名称缩短为qt-src-5.12.0,原名称太长,解压完成后源码根目录如下:/home/image/work/nanopi-k1/qt/qt-src-5.12.0
不同的硬件架构对应不同的qmake.conf,在下载的Qt5.12.11源码中的qtbase/mkspecs/目录下有各种不同的平台,H5使用的是linux-aarch64-gun-g++目录下的qmake配置文件。我们先创建一个文件夹aarch64,将linux-aarch64-gun-g++这个目录的文件拷贝到aarch64目录中。之前文件夹作备份。

mkdir aarch64
cd linux-aarch64-gnu-g++/
cp * ../aarch64/

修改前配置文件内容如下:

#
# qmake configuration for building with aarch64-linux-gnu-g++
#MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublibinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# modifications to g++.conf
QMAKE_CC                = aarch64-linux-gnu-gcc
QMAKE_CXX               = aarch64-linux-gnu-g++
QMAKE_LINK              = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB        = aarch64-linux-gnu-g++# modifications to linux.conf
QMAKE_AR                = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY           = aarch64-linux-gnu-objcopy
QMAKE_NM                = aarch64-linux-gnu-nm -P
QMAKE_STRIP             = aarch64-linux-gnu-strip
load(qt_config)

修改后的文件内容如下:

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib
# 指定编译平台
QT_QPA_DEFAULT_PLATFORM = linuxfb
# 指定平台架构
QMAKE_CFLAGS_RELEASE   += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -ltsinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# 添加自己的交叉编译器路径
# modifications to g++.conf
QMAKE_CC                = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
QMAKE_CXX               = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK              = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB        = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++# modifications to linux.conf
QMAKE_AR                = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY           = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
QMAKE_NM                = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
QMAKE_STRIP             = /opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
load(qt_config)

配置编译选项

在解压的Qt5.12.0源码根目录下使用./configure -h命令,可以查看编译配置选项。

qt5的configure选项说明

Qt 5 是一个跨平台的C++应用程序框架,用于开发具有图形用户界面(GUI)的应用程序以及非GUI程序,如服务器和命令行工具。在开始使用 Qt 5 开发之前,通常需要配置和编译 Qt 库。这个过程可以通过 configure 脚本进行,这个脚本位于Qt源码的根目录下。下面是一些常用的 configure 选项的说明:

基本配置选项

    -prefix <dir>指定安装目录,例如 -prefix /usr/local/qt5。-release构建 release 版本。这是默认选项,如果你不需要 debug 符号,应该使用此选项。-debug构建 debug 版本,包含调试信息,有助于开发时调试。-opensource使用开源版本。这是默认选项,除非你有商业许可。-commercial使用商业版本。如果你购买了商业许可,应该使用此选项。

编译器和链接器选项

    -make <tool>指定使用的 make 工具,例如 gmake 或 nmake。-platform <spec>指定平台规范,例如 linux-g++ 或 win32-msvc。-extapi <version>设置扩展 API 的版本号,用于二进制兼容性。-c++std <standard>指定 C++ 标准,例如 c++11、c++14、c++17 等。

功能模块配置

    -nomake examples不编译示例程序。-nomake tests不编译测试程序。-skip <module>跳过指定的模块编译,例如 -skip qt3d。-feature-<feature>启用或禁用特定功能,例如 -feature-style_windowsmobile。

第三方库集成

    -I<dir>-L<dir>-l<lib>分别用于添加头文件搜索路径、库文件搜索路径和链接到特定的库。例如,-I/usr/include/mylib 添加头文件搜索路径。-no-<feature>-<feature>禁用或启用特定的特性或模块,例如 -no-opengl 禁用 OpenGL 支持。

注意事项

在运行 configure 脚本之前,确保你的系统上已安装了所有必需的依赖项和开发工具。对于不同的操作系统和编译器,平台规范(如 -platform 选项)会有所不同。使用 ./configure -help 可以查看所有可用的配置选项和更详细的说明。通过适当配置这些选项,你可以根据项目需求定制 Qt 的构建过程。

根据选项将需要编译的内容添加到一个shell脚本中进行QT功能裁减,在源码的根目录下新增autoconfig.sh这个文件,名称可以随便定义。

touch autoconfig.sh
chmod +x autoconfig.sh 

下面为文件的内容。

./configure -prefix /home/image/work/nanopi-k1/qt/qt-src-5.12.0/arm-qt \ #这里路径要和自己相配-opensource -confirm-license \-release \-strip \-shared \-xplatform aarch64 \ #这里名称要和自己相配-optimized-qmake \-c++std c++11 \--rpath=no \-pch \-skip qt3d \-skip qtactiveqt \-skip qtandroidextras \-skip qtcanvas3d \-skip qtconnectivity \-skip qtdatavis3d \-skip qtdoc \-skip qtgamepad \-skip qtlocation \-skip qtmacextras \-skip qtnetworkauth \-skip qtpurchasing \-skip qtremoteobjects \-skip qtscript \-skip qtscxml \-skip qtsensors \-skip qtspeech \-skip qtsvg \-skip qttools \-skip qttranslations \-skip qtwayland \-skip qtwebengine \-skip qtwebview \-skip qtwinextras \-skip qtx11extras \-skip qtxmlpatterns \-make libs \-make examples \-nomake tools -nomake tests \-gui \-widgets \-dbus-runtime \--glib=no \--iconv=no \--pcre=qt \--zlib=qt \-no-openssl \--freetype=qt \--harfbuzz=qt \-no-opengl \-linuxfb \--xcb=no \--libpng=qt \--libjpeg=qt \--sqlite=qt \-plugin-sql-sqlite \-recheck-all

配置过程报错解决

运行./autoconfig.sh,生成makefile文件。如果您的ubuntu版本高于16.04,脚本执行可能出现以下问题:

问题1:qrandom.cpp:455:62: error: no matching function for call to ‘std::mersenne_twister_engine
解决方法:定位到qrandom.cpp 文件,文件编辑器打开后,在220行添加类型声明:typedef quint32 result_type;

问题2:error: ‘numeric_limits’ is not a member of ‘std’
解决方法:在报错的.h.cpp 的文件加上#include <limits>头文件(configure会有提示错误,看看哪个文件出现numeric_limits这个报错,就给它添加上这个头文件)

配置完成

配置完成后提示以下内容,makefile文件已生成

Note: Also available for Linux: linux-clang linux-iccNote: -optimized-tools is not useful in -release mode.Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into '/home/image/work/nanopi-k1/qt/qt-src-5.12.0/arm-qt'.Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

执行make指令,源码开始编译

编译过程报错解决

问题1:sh: 1: python: not found Project ERROR: Building QtQml requires Python. make: *** [Makefile:157:module-qtdeclarative-make_first] 错误 3
解决方法:1.用nano或者vi修改别名文件
$ vi .bashrc
添加别名
alias python=python3
保存后,输入下面命令生效
$ source .bashrc
这个时候python已经能打印信息了
2.编译依然有错误,复制python3文件夹为python
先查询python3路径,命令:
$ which python3
$ sudo cp /usr/bin/python3 /usr/bin/python

问题2:error::make_unique is not a member of ‘std’该类型错误由于交叉编译器版本较低,qt5.12源码含c++14以上版本代码,该编译器会报错。解决如下:
将报错文件中的声明类型

std::make_unique<T>(...)

替换为c++14更早期写法,错误有很多处,不要担心,请注意修改

std::unique_ptr<T>(new T())

编译完成

编译完成后,执行make install指令,在根目录生成arm-qt文件夹,里面包含目标板qt运行所需文件,宿主机qt编译所需编译器。

将arm-qt文件夹传送到开发板

压缩文件夹

tar czvf arm-qt.tar.gz  arm-qt

scp命令把文件传送到开发板

scp arm-qt.tar.gz  pi@192.168.199.177:/home/pi

在开发板上执行:将arm-qt文件夹放入/usr/lib

sudo cp  arm-qt.tar.gz /usr/lib

在开发板上执行:在/usr/lib目录下解压压缩包

tar xzvf arm-qt.tar.gz

配置板子环境变量

开发板上执行:编辑/etc/profile文件,末尾添加以下内容

export QT_ROOT=/usr/lib/arm-qt  #虚拟机中编译出来的arm-qt文件,根据自己的目录来填写
export QT_QPA_FONTDIR=/usr/share/fonts #字体的目录,如果Qt中有中文显示,需要拷贝电脑C盘中的字体文件到这个目录下面
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins#Qt支持的插件
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms
export QML2_IMPORT_PATH=$QT_ROOT/qml

开发板上执行:更新一下环境变量信息

source /etc/profile

运行自带例子检验

开发板上执行:运行一下自带例程

. /arm-qt/examples/widgets/animation/animatedtiles/animatedtiles

效果如下:
运行QT实例效果
程序界面

宿主机QT arm环境开发

电脑ubuntu安装之前下载的QT程序,qt-opensource-linux-x64-5.12.0.run

sudo ./qt-opensource-linux-x64-5.12.0.run

安装完成后,点击工具—选项配置编译器
QT Version这里选择编译好的qmake路径,也就是上面arm-qt文件夹中的qmake
qmake路径配置交叉编译器路径,开发板厂提供的编译器aarch64-linux-gnu路径。
编译器将前面配置好的信息添加到编译组件中
在这里插入图片描述

程序验证

选择配置好的套件新建工程
新建工程随便拉点控件
在这里插入图片描述
生成可执行文件,这里查看文件信息已经是ARM平台的可执行程序文件了
在这里插入图片描述
开发板效果展示,这里由于开发板没有拷贝相关字体库,所以这里的控件都没有文字。
演示效果

移植完毕

参考链接:https://blog.csdn.net/libofu/article/details/118641287

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32单片机C语言

1、stdint.h简介 stdint.h 是从 C99 中引进的一个标准 C 库的文件 路径&#xff1a;D:\MDK5.34\ARM\ARMCC\include 大家都统一使用一样的标准&#xff0c;这样方便移植 配置MDK支持C99 位操作 如何给寄存器某个值赋值 举个例子&#xff1a;uint32_t temp 0; 宏定义 带参…

【专题刷题】双指针(四):最接近的三数之和,接雨水

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

chili3d调试笔记3 加入c++ 大模型对话方法 cmakelists精读

加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函数直接用emscripten::function&#xff0c;如&#xff1a; emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…

[Redis]1-高效的数据结构P2-Set

按照惯例&#xff0c;先丢一个官网文档链接。 上篇我们已经了解了高效的数据结构P1-String与Hash。 这篇&#xff0c;我们继续来了解Redis的 Set 与 Sorted set。 目录 有序集合 Sorted set底层实现 集合 Set总结资料引用 有序集合 Sorted set Redis 有序集合是一组唯一的字符…

Python + Playwright:使用正则表达式增强自动化测试

Python + Playwright:使用正则表达式增强自动化测试 前言一、 为什么选择正则表达式?二、 Playwright 中集成正则表达式:途径与方法三、 实战应用:正则表达式解决典型测试难题场景 1:定位 ID 或 Class 包含动态部分的元素场景 2:验证包含可变数字或文本的提示信息场景 3:…

VASP 6.4.1 Ubuntu系统编译安装手册

VASP 6.4.1 Ubuntu系统编译安装手册 &#xff08;基于Ubuntu 22.04 LTS&#xff0c;适用x86_64架构&#xff09; 文章目录 VASP 6.4.1 Ubuntu系统编译安装手册第一章 系统环境深度配置1.1 硬件兼容性验证1.2 操作系统环境准备1.3 数学库深度优化配置 第二章 编译环境深度调优2…

uniapp h5接入地图选点组件

uniapp h5接入地图选点组件 1、申请腾讯地图key2、代码接入2.1入口页面 &#xff08;pages/map/map&#xff09;templatescript 2.2选点页面&#xff08;pages/map/mapselect/mapselect&#xff09;templatescript 该内容只针对uniapp 打包h5接入地图选点组件做详细说明&#x…

java输出、输入语句

先创建一个用于测试的java 编写程序 #java.util使java标准库的一个包&#xff0c;这里拉取Scanner类 import java.util.Scanner;public class VariableTest {public static void main(String[] args) {#创建一个 Scanner 对象Scanner scanner new Scanner(System.in);System.…

AI Agents系列之构建多智能体系统

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

04.Spring 框架注解体系详解

Spring 框架注解体系详解 本文详细介绍 Spring、Spring Boot 及 Spring Cloud 中常用注解的用途、生命周期及使用方式&#xff0c;帮助开发者更深入理解 Spring 注解驱动编程模式。 参考来源&#xff1a;Spring、SpringMVC、SpringBoot、SpringCloud 框架常用注解说明 目录 注…

手撕STL——vector

目录 引言 1&#xff0c;了解 STL 中的 vector 2&#xff0c;先来一个简易版跑起来 2_1&#xff0c;构造函数 2_2&#xff0c;扩容reserve&#xff08;&#xff09; 2_3&#xff0c;push_back&#xff08;&#xff09; 2_4&#xff0c;pop_back&#xff08;&#xff09; …

优恩-具备浪涌保护功能的固态继电器UNRD0610-无触点开关器件‌

MOSFET固态继电器 : 最高负载电压&#xff1a;60V 最大负载电流&#xff1a;10A 快速响应时间&#xff1a;≤1ms 低驱动电流&#xff1a;≤10mA 高绝缘性&#xff0c;输入输出间隔离电压&#xff1a;AC3000V 耐脉冲浪涌冲击能力强 符合IEC 61000-4-2 ESD标准&#xff1a…

Kaamel隐私与安全分析报告:Microsoft Recall功能评估与风险控制

本报告对Microsoft最新推出的Recall功能进行了全面隐私与安全分析。Recall是Windows 11 Copilot电脑的专属AI功能&#xff0c;允许用户以自然语言搜索曾在电脑上查看过的内容。该功能在初次发布时因严重隐私和安全问题而备受争议&#xff0c;后经微软全面重新设计。我们的分析表…

Kotlin协程Semaphore withPermit约束并发任务数量

Kotlin协程Semaphore withPermit约束并发任务数量 import kotlinx.coroutines.* import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main() {val permits 1 /…

鸿蒙语言基础

准备工作 去鸿蒙官网下载开发环境 点击右侧预浏览&#xff0c;刷新和插销按钮&#xff0c;插销表示热更新&#xff0c;常用按钮。 基础语法 string number boolean const常量 数组 let s : string "1111"; console.log("string", s);let n : number …

C++数据结构与二叉树详解

前言&#xff1a; 在C编程的世界里&#xff0c;数据结构是构建高效程序的基石&#xff0c;而二叉树则是其中最优雅且应用广泛的数据结构之一。本文将带你深入理解二叉树的本质、实现与应用&#xff0c;助你在算法设计中游刃有余。 一、二叉树的基本概念 1. 什么是二叉树 二叉树…

浅析数据库面试问题

以下是关于数据库的一些常见面试问题: 一、基础问题 什么是数据库? 数据库是按照数据结构来组织、存储和管理数据的仓库。SQL 和 NoSQL 的区别是什么? SQL 是关系型数据库,使用表结构存储数据;NoSQL 是非关系型数据库,支持多种数据模型(如文档型、键值对型等)。什么是…

piamon实战-- 如何使用 Paimon 的 Java API 实现数据的点查

简介 Apache Paimon(原 Flink Table Store)是一款基于流批一体架构的 ​​高性能数据湖存储框架​​,支持低延迟的数据更新、实时查询和高效的键值点查(Point Lookup)。 本文将深入解析 Paimon 的点查机制,并通过 Java API 代码案例演示如何实现数据的点查功能。 一、Pai…

社交媒体时代的隐私忧虑:聚焦Facebook

在数字化时代&#xff0c;社交媒体平台已成为人们日常生活的重要组成部分。Facebook作为全球最大的社交媒体之一&#xff0c;拥有数十亿用户&#xff0c;其对个人隐私的影响和忧虑也日益凸显。本文将探讨社交媒体时代下&#xff0c;尤其是Facebook平台上的隐私问题。 数据收集…

问题:el-tree点击某节点的复选框由半选状态更改为全选状态以后,点击该节点展开,懒加载出来子节点数据以后,该节点又变为半选状态

具体问题场景&#xff1a; 用户点击父节点复选框将其从半选变为全选&#xff08;此时子节点尚未加载&#xff09;。 点击节点展开触发懒加载&#xff0c;加载子节点。 子节点加载后&#xff0c;组件重新计算父节点状态&#xff0c;发现并非所有子节点被选中&#xff0c;因此父节…