3.1、移植Qt程序到ARM平台----移植Qt程序到ARM平台(扩展)

移植Qt程序到ARM平台(扩展内容)

先安装必备的库

cpp 复制代码
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install g++
sudo apt-get install autoconf automake libtool
sudo apt-get install cmake
sudo apt-get install libclang-dev

再安装

cpp 复制代码
sudo apt-get install bison build-essential gperf flex ruby python libasound2-dev libbz2-dev libcap-dev \
libcups2-dev libdrm-dev libegl1-mesa-dev libgcrypt11-dev libnss3-dev libpci-dev libpulse-dev libudev-dev \
libxtst-dev gyp ninja-build libglu1-mesa-dev libfontconfig1-dev libx11-xcb-dev libicu-dev

Ubuntu移植

我们使用在虚拟机交叉编译Qt源码和项目的方式,得到能在开发板上面运行的程序。

安装交叉编译器(GNU)

交叉编译器下载地址:https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/

将下载的交叉编译工具gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz复制到你想安装的目录下,我们这里选择为**/opt**文件夹下,复制完成后在/opt目录下输入命令进行解压:

bash 复制代码
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C /opt/

解压之后获得一个名为gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu 的文件夹,这个文件夹的名字太长了,我们将这个文件夹重命名为:gcc-aarch64-linux-gnu

bash 复制代码
sudo mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu gcc-aarch64-linux-gnu

将**/opt/gcc-aarch64-linux-gnu/bin**目录添加到环境变量中:

bash 复制代码
sudo gedit /etc/profile

在文件的末尾添加如下内容:

bash 复制代码
export PATH="/opt/gcc-aarch64-linux-gnu/bin:$PATH" 

接下来输入命令,让环境变量生效:

bash 复制代码
source  /etc/profile

重启一下:

bash 复制代码
reboot

重启之后输入命令,查看环境变量是否生效:

bash 复制代码
aarch64-linux-gnu-gcc -v

若出现如下图所示情况,则证明安装成功了。

交叉编译Qt库

如果交叉编译Qt库一直失败,那么可以直接在百度网盘链接中下载我们已经交叉编译成功之后的Qt5.12.10的库

百度网盘链接:https://pan.baidu.com/s/1HtnpytCBBqBOqZi8mfV4VQ?pwd=qcxx

提取码:qcxx

百度网盘文件位置:立创泰山派开发板资料 -> 第11章.【立创·泰山派】常见问题 -> Qt5.12.10-arm(已经交叉编译)【RK3566】 -> qt5.12.10.tar.gz

我们需要下载Qt5.12.10的源码,然后使用交叉编译器编译Qt源码,将支持库转移到开发板上面,这样Qt程序才能运行。

下载地址:https://download.qt.io/archive/qt/5.12/5.12.10/single/

下面这个md5sums.txt文件中是校验码,我们下载完成转移到虚拟机上面建议校验下在下载过程中有没有出错。

将下载的压缩包复制到/opt目录下,解压:

cpp 复制代码
tar -xvf qt-everywhere-src-5.12.10.tar.xz

解压完成之后得到这个文件/opt/qt-everywhere-src-5.12.10

然后我们编辑qmake配置文件:

bash 复制代码
sudo gedit /opt/qt-everywhere-src-5.12.10/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf

将文件改为:

bash 复制代码
#
# qmake configuration for building with aarch64-linux-gnu-g++
#

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                = 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)

主要是添加这三行:

QT_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts

  • QT_QPA_DEFAULT_PLATFORM = linuxfb: 这一行设置了 Qt Quick/QML 应用程序的默认平台插件。linuxfb 是 Linux Framebuffer 的缩写,它是一种在嵌入式系统上直接控制显示设备的方法。设置为 linuxfb 表明 Qt 应用程序将使用 Linux Framebuffer 作为默认的图形平台,这适用于一些嵌入式系统。
  • QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts: 这一行设置了在 Release 模式下编译 C 代码时的编译标志。具体地说:
    • -O2 表示启用优化级别 2,这会使编译器对代码进行更多的优化,以提高执行效率。
    • -march=armv8-a 表示生成适用于 ARMv8-A 架构的代码。ARMv8-A 是支持 64 位指令集的 ARM 架构的一种实现,常见于现代的 ARM 处理器。
  • QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts: 这一行设置了在 Release 模式下编译 C++ 代码时的编译标志,与上一行类似。它也会将相同的优化级别和目标架构应用于 C++ 代码。

进入qt库文件夹:

bash 复制代码
cd /opt/qt-everywhere-src-5.12.10/

我们输入以下命令,创建一个autoConfig.sh脚本:

bash 复制代码
sudo gedit autoConfig.sh

在脚本中输入以下内容:

bash 复制代码
#!/bin/sh
./configure \
-prefix /opt/qt5.12.10-arm \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-dbus \
-no-separate-debug-info \
  • -prefix /opt/qt5.12.10-arm:指定 Qt 的安装路径为 /opt/qt5.12.10-arm。这意味着编译完成后 Qt 库和工具将安装到这个目录下。
  • -confirm-license:确认接受 Qt 的许可协议。
  • -opensource:使用开源许可证编译 Qt。
  • -release:编译 Qt 为发布版本,而非调试版本。
  • -make libs:只编译 Qt 库,而不编译示例程序等。
  • -xplatform linux-aarch64-gnu-g++:指定目标平台为 Linux,并使用 aarch64 架构进行编译。gnu-g++ 表示使用 GNU 工具链进行编译。
  • -pch:启用预编译头文件功能,以加快编译速度。
  • -qt-libjpeg-qt-libpng-qt-zlib:指定 Qt 在编译时使用系统中已安装的 libjpeg、libpng 和 zlib 库。
  • -no-opengl:不编译 Qt 的 OpenGL 模块。
  • -no-sse2:禁用 SSE2 指令集优化。
  • -no-openssl:不编译 Qt 的 OpenSSL 模块。
  • -no-cups:不编译 Qt 的 CUPS 模块(用于打印支持)。
  • -no-glib:不编译 Qt 的 GLib 模块。
  • -no-dbus:不编译 Qt 的 D-Bus 模块。
  • -no-separate-debug-info:不生成单独的调试信息文件。

给这个.sh脚本运行权限:

bash 复制代码
sudo chmod 777 autoConfig.sh

然后运行autoConfig.sh ,会自动生成Makefile文件:

bash 复制代码
./autoConfig.sh

运行完成截图:

接下来,我们输入make进行编译(时间有点长):

先切换为root用户,如果直接执行sudo make -j12会报环境变量错误,sudo会创建一个新的环境

bash 复制代码
sudo su - root
make -j12

编译完成之后输入下面命令开始安装:

bash 复制代码
sudo su - root
make install

一段时间后,可以看见/opt目录下出现了我们指定的安装目录/opt/qt5.12.10-arm,表示安装成功。

相关推荐
tankeven2 小时前
HJ168 小红的字符串
c++·算法
白杆杆红伞伞2 小时前
Qt Event
开发语言·qt
Magic--2 小时前
Qt 桌面计算器项目
开发语言·qt
特立独行的猫a2 小时前
HarmonyOS鸿蒙PC的QT应用开发:QT项目运行原理与 EmbeddedUIExtensionAbility介绍
qt·华为·harmonyos·openharmony·鸿蒙pc
张健11564096482 小时前
QT创建线程
开发语言·qt
鲸渔2 小时前
【C++ 输入输出】cin、cout、cerr 与格式化输出
开发语言·c++·算法
香蕉鼠片2 小时前
排序算法C++
c++·算法·排序算法
森G2 小时前
51、Move方式创建线程---------多线程
c++·qt
xiaoye-duck2 小时前
《算法题讲解指南:优选算法-栈》--65.删除字符中的所有相邻重复项,66.比较含退格的字符串,67.基本计算器II,68.字符串解码,69.验证栈序列
c++·算法·