注意:
📌 Qt演示项目使用的是Windows版本Qt5.12.10编写的项目。 虚拟机使用的是Ubuntu18.04.6版本的系统。
一、Ubuntu移植
我们使用在虚拟机交叉编译Qt源码和项目的方式,得到能在开发板上面运行的程序。
1. 安装交叉编译器(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目录下输入命令进行解压:
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
sudo mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu gcc-aarch64-linux-gnu
将 /opt/gcc-aarch64-linux-gnu/bin 目录添加到环境变量中:
sudo gedit /etc/profile
在文件的末尾添加如下内容:
export PATH="/opt/gcc-aarch64-linux-gnu/bin:$PATH"
接下来输入命令,让环境变量生效:
source /etc/profile
重启一下:
reboot
重启之后输入命令,查看环境变量是否生效:
aarch64-linux-gnu-gcc -v
若出现如下图所示情况,则证明安装成功了。
2. 交叉编译Qt库
WARNING
📌 如果交叉编译Qt库一直失败,那么可以直接在下载中心的百度网盘链接
中下载我们已经交叉编译成功之后的Qt5.12.10的库
📌 在 下载中心
->百度网盘
-> 第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目录下,解压:
tar -xvf qt-everywhere-src-5.12.10.tar.xz
解压完成之后得到这个文件/opt/qt-everywhere-src-5.12.10 然后我们编辑qmake配置文件:
sudo gedit /opt/qt-everywhere-src-5.12.10/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf
将文件改为:
#
# 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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
主要是添加这三行:
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库文件夹:
cd /opt/qt-everywhere-src-5.12.10/
我们输入以下命令,创建一个autoConfig.sh脚本:
sudo gedit autoConfig.sh
在脚本中输入以下内容:
#!/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 \
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-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脚本运行权限:
sudo chmod 777 autoConfig.sh
然后运行autoConfig.sh,会自动生成Makefile文件:
./autoConfig.sh
运行完成截图:
接下来,我们输入make进行编译(时间有点长):
sudo make -j12
编译完成之后输入下面命令开始安装:
sudo make install
一段时间后,可以看见/opt目录下出现了我们指定的安装目录/opt/qt5.12.10-arm,表示安装成功。
3. 编译Qt项目文件
接下来将项目文件复制到虚拟机中,进行交叉编译,任意位置都可。 我们先要将 .user 文件删除,因为这是Windows环境下的用户配置:
然后我们使用cd命令进入项目文件夹目录中,在里输入以下命令利用qmake制作Makefile文件:
注意:这里是那个交叉编译的Qt库安装目录(qt5.12.10-arm)。 qmake 的绝对路径,如果更改了qmake的地址需要自己改成实际的绝对地址。
/opt/qt5.12.10-arm/bin/qmake
然后我们就能发现在项目目录中出现了Makefile文件,我们运行Makefile:
sudo make -j12
等待一会儿,我们就能看到一个名字和.pro文件一致的可运行程序就出现了:
图片中为例:我们要复制到开发板上面运行的就是 ClockTop 这个文件!
4. 移植Qt库
我们接下来要将qt5.12.10-arm这个文件夹复制到开发板上面,Qt程序需要这些库才可以运行!
WARNING
📌 如果交叉编译Qt库一直失败,那么可以直接在下载中心的百度网盘链接
中下载我们已经交叉编译成功之后的Qt5.12.10的库
📌 在 下载中心
->百度网盘
-> 第11章.【立创·泰山派】常见问题
-> Qt5.12.10-arm(已经交叉编译)【RK3566】
-> qt5.12.10.tar.gz
在/opt目录下输入命令:
将qt5.12.10-arm文件夹压缩为qt5.12.10.tar.gz文件
tar -zcvf qt5.12.10.tar.gz qt5.12.10-arm
然后将qt5.12.10.tar.gz这个文件转移到开发板的/opt目录下,这个可以使用U盘或者是其他传输工具。
这里就不演示了。
转移到/opt目录下后,我们解压一下:
sudo tar -xvzf qt5.12.10.tar.gz
接着将qt程序运行所依赖的相关文件、配置等添加到环境变量中:
sudo vi /etc/profile
在文件的最末尾添加:
export QTEDIR=/opt/qt5.12.10-arm/
export LD_LIBRARY_PATH=/opt/qt5.12.10-arm/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FONTDIR=/usr/share/fonts/truetype/ubuntu
2
3
4
5
这些命令是用来设置 Qt 运行时环境的相关变量。
QTEDIR
: 这个变量指定了 Qt 的安装目录。在前一步中,Qt 被安装在/opt/qt5.12.10-arm/
目录下。LD_LIBRARY_PATH
: 这个变量告诉系统在运行时应该搜索哪些目录来找到动态链接库。将 Qt 的库目录添加到了这个变量中,以便程序能够正确地链接到 Qt 库。QT_QPA_PLATFORM_PLUGIN_PATH
: 这个变量指定了 Qt 平台插件的路径。它指向了 Qt 的插件目录。QT_QPA_PLATFORM
: 这个变量指定了 Qt 使用的平台插件。它被设置为linuxfb
,这意味着 Qt 会使用 Linux Framebuffer 作为其图形输出。QT_QPA_FONTDIR
: 这个变量指定了 Qt 字体文件的目录。它被设置为字体文件所在的目录。 通过设置这些环境变量,可以确保在运行 Qt 程序时,它能够正确地找到所需的库、插件和字体文件,从而保证程序能够正常工作。
注意:
📌 这个/usr/share/fonts/truetype/ubuntu路径可以改为其他的路径,如果你在项目中指定了某个字体,可以将该字体的.ttf文件转移掉开发板然后直接进行指定。
最后我们重启下开发板,使环境变量生效:
reboot
5. Qt程序运行
我们将虚拟机中的ClockTop文件复制到我们的开发板中,可以使用U盘或者其他工具。
复制到泰山派的文件就是图片中框起来。
复制完成后,我们就可以直接在泰山派中直接运行Qt程序了。
sudo ./ClockTop
二、Buildroot Qt5移植
Buildroot 是一个用于嵌入式 Linux 系统的工具,它可以帮助你构建定制化的 Linux 系统镜像。Buildroot 支持集成 Qt5 到你的嵌入式 Linux 系统中,并且可以帮助你构建包含 Qt5 应用程序的根文件系统。
1. 编译SDK
我们进入SDK目录下
这是我的SDK目录
输入以下命令选择泰山派的板级配置与rootfs环境变量。
./build.sh lunch && export RK_ROOTFS_SYSTEM=buildroot
然后我们开始编译(时间可能有点长,看电脑配置)
注意:要确保所有必要软件都安装了。详细可以看泰山派资料【编译SDK】 ./build.sh all 以下情况就是编译完成了
2. 加载环境变量
我们要执行 buildroot/build/envsetup.sh 脚本,将其中定义的环境变量、函数等加载到当前 shell 环境中。
注意:我们当前的操作还是在linuxSDK根目录下,不需要进入buildroot目录。
source buildroot/build/envsetup.sh
选择:65
3. menuconfig菜单添加Qt支持
在SDK根目录下,输入以下命令进行配置
make menuconfig
进入以下界面:
- 方向键 ↑↓ 移动选中 Target packages
敲回车进入
- 方向键 ↑↓ 移动选中 Graphic libraries and applications (graphic/text)
敲回车进入
- 进入之后,方向键 ↑↓ 翻动找到 Qt5,按 键盘y键 选中,前面出现 [] 标志之后,就可以回车进入了。
- 进入之后将里面的内容修改为下方图片的样子。
[*] Qt5 --->
[*] gui module
[*] widgets module
[*] fontconfig support
[*] GIF support
[*] JPEG support
[*] PNG support
[*] syslog support
[*] Enable Tslib support
[*] qt5serialport
[*] qt5virtualkeyboard
(en_GB) language layouts
2
3
4
5
6
7
8
9
10
11
12
- Qt5:选择编译 Qt5 库。
- gui module:选择编译 Qt5 的 GUI 模块。
- widgets module:选择编译 Qt5 的 Widgets 模块。
- fontconfig support:Fontconfig 是一个用于配置和自定义字体的库,它提供了一种统一的方式来管理系统上安装的字体。启用这个选项可以让 Qt5 库在运行时使用 Fontconfig 来管理字体,这样可以更好地支持字体的配置和渲染。
- GIF support:启用对 GIF 图像格式的支持。
- JPEG support:启用对 JPEG 图像格式的支持。
- PNG support:启用对 PNG 图像格式的支持。
- syslog support:启用系统日志支持。
- Enable Tslib support:启用对 Tslib 的支持,Tslib 是一个用于触摸屏设备的抽象库。
- qt5serialport:选择编译 Qt5 的串口通信模块。
- qt5virtualkeyboard:选择编译 Qt5 的虚拟键盘模块。
- (en_GB) language layouts:选择英国英语作为默认语言布局。
- gui module:选择编译 Qt5 的 GUI 模块。
保存之后(方向键左右选择Save敲回车即可保存),我们可以选择 Exit 返回上一个界面了。
- 退出 menuconfig 菜单
我们在主菜单也选择Exit 就能退出 menuconfig 菜单了(回到命令行)
4. 保存配置
我们保存退出menuconfig菜单后,在SDK根目录下输入以下命令将刚刚保存的配置生效为默认配置
make savedefconfig
5. 编译
开始整体编译,因为之前已经编译过了,所以速度会快得多。
./build.sh all
注意:在编译的过程中,会自动下载刚刚我们添加过的模块,例如Qt5会被自动下载。
如果出现下列报错或者下载过慢,请直接在你的windows电脑上下载文件,然后将文件放在buildroot文件夹下的dl文件夹中。 (复制地址到浏览器搜索框) 这种是虚拟机打不开网站所导致的:
完成之后,重新输入 ./build.sh all
即可继续编译。 出现下面这种情况就是编译成功了。
6. 测试
成功后,我们在 /buildroot/output/build 路径下会找到 qt5base-5.15.2 文件夹。
在 /buildroot/output/rockchip_rk3566/target 路径下搜索也能找到 qt 相关文件夹和文件,这一点很重要!
sudo find * -name "*qt*"
7. 生成镜像
一切没有问题了,在SDK根目录下输入以下命令生成镜像。
./mkfirmware.sh
如果只想烧录rootfs.img镜像,这时候就可以去SDK根目录下的rockdev文件夹中寻找rootfs.img烧录即可。
如果想要烧录完整镜像,则可以继续运行下面的命令,即可生成完整的系统镜像(update.img)。
./build.sh updateimg
8. 烧录镜像
我们生成的镜像都在SDK目录下的rockdev文件夹中,里面就是全部的镜像。 具体烧录可以参考:
9. 编译Qt项目文件
将镜像烧录进开发板之后,开发板Qt环境就已经就绪了,接下来就可以开始编译Qt的项目了。
使用buildroot文件中的qmake工具编译Qt项目。
位置在:linuxSDK 目录下的 /buildroot/output/rockchip_rk3566/build/qt5base-5.15.2/bin/qmake
接下来将项目文件复制到虚拟机中,进行交叉编译,任意位置都可。
我们先要将 .user 文件删除,因为这是Windows环境下的用户配置:
然后我们使用cd命令进入项目文件夹中,在里输入以下命令利用qmake制作Makefile文件:
sudo /home/lipeng/share/TaiShanPai/linuxSDK/buildroot/output/rockchip_rk3566/build/qt5base-5.15.2/bin/qmake ClockTop.pro
注意:这里的qmake地址是我自己电脑的绝对路径,仿照我的路径大家自己找一下,不难找。 运行qmake之后,生成了一个Makefile文件。
然后我们make一下,生成可执行程序。
sudo make
成功之后会在项目文件夹中生成一个可执行文件:
给这个文件加权限。
sudo chmod 777 ClockTop
10. Qt程序运行
我们将虚拟机中的ClockTop文件复制到我们的开发板中,可以使用U盘或者其他工具。
复制到泰山派的文件就是图片中框起来。
复制完成后,我们就可以直接在泰山派中直接运行Qt程序了。
./ClockTop
或者
这里的
--platform linuxfb
参数告诉 ClockTop 使用 Linux Framebuffer (linuxfb)作为显示平台。
./ClockTop --platform linuxfb