当前位置: 首页 > news >正文

全志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

相关文章:

  • 常用的优化算法及横向对比
  • langchain tools源码解析以及扩展
  • 快速使用工具Cursor
  • 【天外之物】线元
  • MacOS怎么显示隐藏文件
  • python-图片分割
  • 慢速率拉伸热变形工艺试验机
  • 通俗理解MCP(Model Context Protocol)和A2A(Agent2Agent)
  • kaamel Privacy agent:AI赋能的隐私保护技术解决方案
  • [特殊字符] 当Docker遇上大模型:本地运行LLM的奇幻漂流 [特殊字符]
  • 68.评论日记
  • 使用dompurify修复XSS跨站脚本缺陷
  • ABAP OLE
  • 一次制作参考网杂志的阅读书源的实操经验总结(附书源)
  • 残差连接缓解梯度消失的含义;残差连接的真正含义:F(x) = y - x ;y=F(x)+x
  • IE之路专题12.BGP专题
  • ES中常用的Query和查询作用,以及SpringBoot使用实例
  • volatile的进一步深入理解
  • 如何导出pip下载的paho-mqtt包
  • 对比说明Navicat for MySQL和DBeaver的数据同步功能
  • 亚振家居半年内第二次筹划变更控制权:控股股东正与收购方商谈交易核心条款
  • 美股再遭重挫,标普500指数11个板块全线溃败
  • AI换脸侵权案入选最高法典型案例:明晰人工智能使用边界
  • 【社论】地铁读书人也是一道城市风景
  • “雷公”起诉人贩子王浩文案将开庭:索赔6元,“讨个公道”
  • 合肥打造全球首个无人艇超级工厂,请看《浪尖周报》第21期