全志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.96
寸ST7789V
屏幕(已移植好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
官方wik
i教程里有链接,自行下载:
开发板使用教程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++
应用程序框架,用于开发具有图形用户界面(GU
I)的应用程序以及非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 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
配置交叉编译器路径,开发板厂提供的编译器
aarch64-linux-gnu
路径。
将前面配置好的信息添加到编译组件中
程序验证
选择配置好的套件新建工程
随便拉点控件
生成可执行文件,这里查看文件信息已经是ARM平台的可执行程序文件了
开发板效果展示,这里由于开发板没有拷贝相关字体库,所以这里的控件都没有文字。
移植完毕
参考链接:https://blog.csdn.net/libofu/article/details/118641287