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

news2025/4/21 6:04:01

移植步骤

  • 机器环境
  • 下载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 = sublib

include(../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 -lts


include(../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-icc

Note: -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.coloradmin.cn/o/2339233.html

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

相关文章

使用EXCEL绘制平滑曲线

播主播主&#xff0c;你都多少天没更新了&#xff01;&#xff01;&#xff01;泥在干什么&#xff1f;你还做这个账号麻&#xff1f;&#xff01;&#xff01;&#xff01; 做的做的&#xff08;哭唧唧&#xff09;&#xff0c;就是最近有些忙&#xff0c;以及…… 前言&…

Warcraft Logs [Classic] [WCL] Usage Wizard <HTOC>

‌HTOC&#xff08;十字军的试炼&#xff09;副本中各个BOSS的ID如下‌&#xff1a; ‌629 - 诺森德野兽‌ ‌633 - 加拉克苏斯大王‌ ‌637 - 派系冠军‌ ‌641 - 瓦格里双子‌ ‌645 - 阿努巴拉克‌ encounterID!637 and encounterID!641 encounterID NOT IN (637,641) 伤害 …

在服务器上部署MinIO Server

MinIO的优势 高性能&#xff1a;MinIO号称是目前速度最快的对象存储服务器&#xff0c;据称在标准硬件上&#xff0c;对象存储的读/写速度最高可以高达183 GB/s和171 GB/s&#xff0c;可惜我的磁盘跟不上 兼容性&#xff1a;MinIO基于Amazon S3协议&#xff0c;并提供了与S3兼…

一个改善Entity Framework异常处理和错误信息的开源项目

使用DDD从零构建一个完整的系统 使用Entity Framework作为ORM框架应该是绝大多数项目的选择&#xff0c;使得我们操作数据库变得简单方便&#xff1b;但是我们操作数据库&#xff0c;绝对是无法避免数据库发生异常的情况&#xff0c;数据库针对每一种异常也都会提供一个编码来…

计算机视觉——基于 Yolov8 目标检测与 OpenCV 光流实现目标追踪

1. 概述 目标检测&#xff08;Object Detection&#xff09;和目标追踪&#xff08;Object Tracking&#xff09;是计算机视觉中的两个关键技术&#xff0c;它们在多种实际应用场景中发挥着重要作用。 目标检测指的是在静态图像或视频帧中识别出特定类别的目标对象&#xff0…

PHP使用pandoc把markdown文件转为word

文章目录 首先安装pandocPHP处理 服务器操作系统是Linux&#xff0c;centos 首先安装pandoc yum install -y pandoc安装完成后输入如下代码&#xff0c;检查安装是否成功 pandoc --versionPHP处理 我把markdown内容存到了数据库里&#xff0c;所以要从数据库读取内容。对内容…

OBS 日期时间.毫秒时间脚本 date-and-time.lua

文章目录 OBS 日期时间.毫秒时间脚本&#xff1a;效果 OBS 日期时间.毫秒时间脚本&#xff1a; obs obslua source_name ""last_text "" format_string "" activated false-- 此函数用于获取精确的毫秒级时间戳&#…

探索大语言模型(LLM):目标、原理、挑战与解决方案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言语言模型的目标语言模型的数学表示语言模型面临的挑战解决参数量巨大的方法1. 马尔可夫假设2. 神经网络语言模型3.自监督学习4. 分布式表示 脑图总结 前言 在自…

ES基本操作(Java API)

1. 导入restClient依赖 <!-- es --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency> <!…

得物官网sign签名逆向分析

打开得物官网&#xff0c;点击鞋类&#xff0c;可以看到请求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…

vivado 时钟IP核(MMCM PLL)

CMT简介 FPGA中时钟管理模块&#xff08;CMT&#xff09;包括PLL和MMCM&#xff0c;用于将时钟倍频(比如输入时钟25M&#xff0c;我们要产生50M时钟)、分频(在不影响系统功能的前提下&#xff0c;较低的工作时钟&#xff0c;能够降低系统功耗)、改变相位偏移或占空比等。 当需要…

hackmyvm-airbind

收集信息 arp-scan -l nmap -sS -v 192.168.195.162 访问扫描到的ip&#xff0c;直接跳转到登录页面&#xff0c;利用admin/admin弱口令登录 在settings.php中找到一处文件上传&#xff0c;上传一句话木马&#xff0c;上传成功 反弹shell 上传php-reverse-shell.php 抓包&am…

知识了解03——怎么解决使用npm包下载慢的问题?

1、为什么使用npm下载包会下载的慢 因为使用npm下载包时&#xff0c;默认使用国外服务器进行下载&#xff0c;此时的网络传输需要经过漫长的海底电缆&#xff0c;因此下载速度会变慢 2、怎么解决&#xff1f;&#xff08;切换镜像源&#xff09; &#xff08;1&#xff09;方…

【算法数据结构】leetcode37 解数独

37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 题目要求每一行 &#xff0c;每一列&#xff0c;每个3*3 的子框只能出现一次。每个格子的数字范围1-9. 需要遍历每个空格填入可能的数字&#xff0c;并验证符合规则。如果符合就填入&#xff0c;不符…

招商信诺原点安全:一体化数据安全管理解决方案荣获“鑫智奖”!

近日&#xff0c;“鑫智奖 2025第七届金融数据智能优秀解决方案评选”榜单发布&#xff0c;原点安全申报的《招商信诺&#xff1a;数据安全一体化管理解决方案》荣获「信息安全创新优秀解决方案」。 “鑫智奖第七届金融数据智能优秀解决方案评选”活动由金科创新社主办&#x…

楼宇自控系统如何为现代建筑打造安全、舒适、节能方案

在科技飞速发展的当下&#xff0c;现代建筑对功能和品质的要求日益提升。楼宇自控系统作为建筑智能化的核心技术&#xff0c;宛如一位智慧的“管家”&#xff0c;凭借先进的技术手段&#xff0c;为现代建筑精心打造安全、舒适、节能的全方位解决方案&#xff0c;让建筑真正成为…

吃透LangChain(四):消息管理与聊天历史存储

消息存储在内存 下面我们展示一个简单的示例&#xff0c;其中聊天历史保存在内存中&#xff0c;此处通过全局 Python 字典实现。我们构建一个名为 get_session_history 的可调用对象&#xff0c;引用此字典以返回chatMessageHistory实例。通过在运行时向 RunnablewithMessageHi…

【差分隐私相关概念】瑞丽差分隐私(RDP)命题4

命题4的证明详解&#xff08;分情况讨论&#xff09; 背景与设定 机制&#xff1a; f : D → R f: \mathcal{D} \to \mathcal{R} f:D→R 是由 n n n 个 ϵ \epsilon ϵ-差分隐私机制自适应组合而成。相邻输入&#xff1a; D D D 和 D ′ D D′ 是相邻数据集。目标&#xf…

RoBoflow数据集的介绍

https://public.roboflow.com/object-detection&#xff08;该数据集的网址&#xff09; 可以看到一些基本情况 如果我们想要下载&#xff0c;直接点击 点击图像可以看到一些基本情况 可以点击红色箭头所指&#xff0c;右边是可供选择的一些yolo模型的格式 如果你想下载…

免费将AI生成图像放大4倍的方法

有些人不需要任何高级工具和花哨的技巧;他们只需要一种简单的方法来提升图像分辨率而不损失任何质量 — 今天,我们将学习如何做到这一点。 生成AI图像最大的问题之一是什么?最终结果通常分辨率非常低。 这会导致很多不同的问题,特别是对于那些想要在内容或项目中使用这些…