移植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,表示安装成功。
