将以前的开发文档在此做一个记录。
一、介绍
Qt是一个跨平台的应用程序开发框架,支持多种操作系统和硬件架构,包括ARM架构的Linux。
RK3399Pro是一款基于ARM架构的处理器,用于嵌入式系统。可以在RK3399上搭建Qt开发环境,进行项目开发。
在ARM架构的Linux系统上安装Qt开发环境,大致需要以下几步:安装交叉编译工具链、下载Qt源代码、编译安装Qt源码。
二、搭建步骤
假定工控机内已安装完成Ubuntu20.04。
1、安装交叉编译工具链
可以从Ubuntu软件源中安装,也可以从第三方资源库或官方网站下载。以下是在Ubuntu软件源中安装交叉编译工具链的命令:
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt install cmake
通过如下命令验证是否安装成功:
aarch64-linux-gnu-gcc -v
aarch64-linux-gnu-g++ -v
若出现类似下图所示情况,则证明安装成功了。
说明:
gcc-aarch64-linux-gnu和g++-aarch64-linux-gnu是交叉编译工具链中的两个工具,用于在x86或者其他架构的系统上编译ARM架构的代码。gcc-aarch64-linux-gnu是GCC编译器的一个ARM64交叉编译版本,可以将C代码编译成ARM64平台上的可执行文件。而g++-aarch64-linux-gnu则是G++编译器的ARM64交叉编译版本,用于编译C++代码。
在RK3399 ARM架构的系统中搭建QT开发环境时,需要使用这两个工具来编译QT应用程序,因为QT开发工具包是在x86架构的系统上编译的,无法直接在ARM架构的系统上运行。因此需要使用交叉编译工具链将QT应用程序编译成可以在ARM架构的系统上运行的可执行文件。
安装xcb库
在如下连接Index of /dist中下载libxcb-1.9.tar.gz和xcb-proto-1.9.tar.gz。
将两个压缩包分别解压到工控机中,并进入各自目录中,进行如下操作来安装xcb库:
先cd到xcb-proto-1.9源代码目录中
./configure
make
make install
然后cd到libxcb-1.9源代码目录中
./configure
make
make install
至此,libxcb库已经安装到系统中,安装目录为/usr/lib/aarch64-linux-gnu。
注:xcb库是图形界面所用的库,对于只开发命令行程序的工控机,无需安装
2、下载Qt源代码并解压
1)下载源码:
可以在官网Index of /official_releases/qt/6.5/6.5.0/single下载qt-everywhere-src-6.5.0.tar.xz。
也可以在此链接Index of /official_releases/qt/6.5/6.5.0/submodules只下载自己项目需要的子部件,需要下载.tar.xz格式的压缩包。
可以在Windows下下载完成后拷贝到Ubuntu中,也可直接在Ubuntu中的浏览器下载。
2)解压源码:
将下载的qt-everywhere-src-6.5.0.tar.xz压缩包复制到/opt目录下:
cp qt-everywhere-src-6.5.0.tar.xz /opt
完成后在/opt目录下输入命令:
tar -xvf qt-everywhere-src-6.5.0.tar.xz
解压完成后进入获得的文件夹下:
cd /opt/qt-everywhere-src-6.5.0
ls一下:
ls
可以看到很多文件,类似下面这张图。
3、编译Qt源码并安装
接着上一步输入命令:
sudo gedit /opt/ qt-everywhere-src-6.5.0/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf
在其中添加如下内容并保存:
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts
类似下图所示:
说明:
没有gedit命令的话,可以先通过apt安装,或者直接用vim进行编辑。
·QT_QPA_DEFAULT_PLATFORM = linuxfb:设置QT的平台插件为linuxfb,表示使用Linux Framebuffer作为GUI显示的方式。Linux Framebuffer是Linux内核提供的一种硬件无关的图形显示抽象层,可以让用户空间程序通过读写Linux Framebuffer设备节点来实现图形显示功能。
·QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts:编译选项,表示编译Release版本的代码时启用-O2优化级别和ARMv8-A架构的指令集。-O2优化级别表示启用一些优化选项来提高代码执行效率,ARMv8-A指令集是ARM架构的64位指令集。-lts表示链接名为ts的库文件,该库文件用于支持触摸屏输入。
·QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts:类似于QMAKE_CFLAGS_RELEASE,但是是用于编译C++代码的选项。
这些选项和环境变量可以帮助QT应用程序在ARM架构的系统上编译和运行。通过使用linuxfb平台插件,可以让QT应用程序使用Linux Framebuffer作为图形界面显示方式,而编译选项中的优化选项可以提高代码执行效率,使得应用程序的运行更加流畅。
保存后接着输入命令:
sudo gedit auto.sh
新建的auto.sh为交叉编译自动配置脚本,在其中添加以下内容并保存:
#!/bin/sh
./configure \-prefix /opt/qt6.4.3-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-xcb \
-no-dbus \
-no-separate-debug-info \
其中/opt/qt6.4.3-arm 为编译后的安装目录,-xplatform linux-aarch64-gnu-g++为交叉编译相关选择,还记得之前我们修改过/opt/qtbase-everywhere-opensource-src-6.4.3/mkspecs/linux-aarch64-gnu-g++文件夹下的qmake.conf文件吧,前后是有对应的。
说明:
·-prefix /opt/qt6.4.3-arm:指定QT编译后的安装目录为/opt/qt6.4.3-arm。
·-confirm-license:确认QT的使用许可证。
·-opensource:使用开源版本的QT。
·-release:编译QT的Release版本。
·-make libs:只编译QT库文件。
·-xplatform linux-aarch64-gnu-g++:指定QT的交叉编译平台为aarch64架构的Linux系统,使用的编译器为GNU C++。
·-pch:启用预编译头文件。
·-qt-libjpeg、-qt-libpng、-qt-zlib:指定QT需要使用的图像文件解码库(libjpeg、libpng、zlib)。
·-no-opengl:不使用OpenGL。
·-no-sse2:不使用SSE2指令集,这是为了兼容一些老的ARM处理器,这些处理器不支持SSE2指令集。
·-no-openssl:不使用OpenSSL库。
·-no-cups:不使用CUPS打印系统。
·-no-glib:不使用GLib库。
·-no-xcb:不使用XCB库。
·-no-dbus:不使用DBus。
·-no-separate-debug-info:不生成独立的调试信息。
这些参数的设置可以根据具体情况进行调整,以适应特定的应用场景和目标平台。这些参数和选项的使用可以帮助用户在ARM架构的Linux系统上编译出符合要求的QT库文件,以便开发和运行QT应用程序。
接着修改该文件权限并执行:
sudo chmod u+x auto.sh
sudo ./auto.sh
注:如果提示找不到cmake命令或者对应版本不对,可以在auto.sh脚本的第二行加上:export PATH=/path/to/cmake/bin:$PATH 来指定cmake命令
首次时间会比较长。结束后会显示类似下图的结果,并生成Makefile文件。
接着输入:
sudo make
进行编译,大概需要一个小时,编译完成后输入命令:
sudo make install
大约一分钟后,可以看见/opt目录下出现了指定的安装目录/opt/qt6.4.3-arm,表示安装成功。
4、设置环境变量
此时系统可能找不到我们需要的qmake,需要手动配置环境变量。
打开/etc/profile:
sudo gedit /etc/profile
在末尾增加以下代码
export QTDIR=/opt/qt6.4.3-arm //跟自己的Qt安装路径对应
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
保存退出后,使用如下命令使其生效:
source /etc/profile
然后重启系统。可以使用如下命令检查是否配置成功:
qmake -v
如果有对应的qt版本信息输出,则说明Qt已经安装成功。
对于不同项目,比如使用了opencv、ffmpag、seetaface等,需要将对应的库路径配置好,或将库文件放到/opt/qt6.5-arm/lib中。
5、编译子模块注意事项
如果一次编译整个Qt源码,则用上边的方法可行。
如果只编译几个Qt子模块,需要更改一些操作:
1) 按照上边的完整步骤编译qtbase子模块。
2) 编译成功后更改环境变量,将下列语句加入进去:
export QT6_DIT=/opt/qt6.4.3-arm/lib/cmake/Qt6
export QTEDIR=/opt/qt6.4.3-arm
保存退出后,使用如下命令使其生效:
source /etc/profile
3) 编译其他子模块
a. 在QT官网下载项目需要的子模块,比如qt5compat-everywhere-src-6.5.0.tar.xz,链接如下:https://download.qt.io/official_releases/qt/6.4/6.4.3/submodules/。
以此模块为例,介绍子模块编译方法:
make install INSTALL_ROOT=/path/to/install/dir
-
b. 将下载的压缩包解压到工控机中,cd到其源码目录下。
执行命令:(不要忽略 空格 和 . 点)
cmake .
构建完成后,执行命令:
make -j2
make install INSTALL_ROOT=/opt/qt6.4.3-arm
这将会将Qt子模块的头文件和库文件安装到/path/to/install/dir/usr /include/qt5 /Qt<Module> 和 /path/to/install/dir/usr/lib/x86_64-linux-gnu/qt5/plugins/<Module>/ 目录下。这样在项目中使用 Qt 子模块时,就只可以使用 Qt +=子模块名 来使用子模块。
此时可直接进行e步骤。
c. 如果在上一步未使用make install INSTALL_ROOT=/opt/qt6.4.3-arm,或者最终未能使用,可以尝试默认安装方式,然后进行d步骤的操作。
d. 则子模块会默认安装到/usr/local中,需要对其进行复制,以便于开发使用:(以QtXlsx子模块为例,qt5compat等其他子模块同理)
·将生成的include文件夹下的QtXlsx文件夹拷贝到/opt/qt6.4.3-arm/include下(注意看头文件内容是否为头文件的相对路径,是则需要替换为包含内容的头文件)
·将生成的lib文件夹下Qt5Xlsxd.lib、Qt5Xlsx.lib、Qt5Xlsx.prl、Qt5Xlsxd.prl拷贝到/opt/qt6.4.3-arm/lib下
·将生成的lib下Qt5Xlsx.dll、Qt5Xlsxd.dll拷贝到/opt/qt6.4.3-arm/bin下
·将生成的mkspecs\modules-inst下qt_lib_xlsx.pri、qt_lib_xlsx_private.pri拷贝到/opt/qt6.4.3-arm/mkspecs\modules下(此步不做则pro文件中添加QT += xlsx模块不会被识别)
e. 全部子模块安装完毕后,需重启系统更新Qt配置文件。
三、项目移植
从Windows下编写的项目移植到linux下时,需更改seetaface、OpenCV等库,将其更改为Linux版本的。