汇创慧玩
- 写在前面
- 1. 查看系统架构相关指令
- 2. ARM64交叉编译器环境搭建
- 3. Qt编译arm64环境搭建
- 4. 配置 Qt的本地aarch64交叉编译器
- 5. 工程建立及编译验证
写在前面
苦辣酸甜时光八载,春夏秋冬志此一生
Qt简介:
Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。
Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。
在探索前期安装过程也是出现了星星点点的未知错误,摸黑探路,绕了许多弯路。
最近由于项目需要做国产系统适配,软件需要适配不同架构CPU!基于此特将经验寄予此文,望更多志同道合的朋友在这条探索的路上少走弯路,尽入主题!
环境:
PC系统:Ubutu20.04(x86_64架构) <本机>
Qt版本:Qt5.12.8(GCC 9.3.0,64bit) <本机>
Qt Creator 版本:4.11.0 <本机>
交叉编译器:gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <本机>
国产系统:Kylin Linux Advanced Server release V10(4.19.90-25.10.v2101.ky10.aarch64) 部署环境<即arm64架构>
GCC:v8.3.0 部署环境<即arm64架构>
1. 查看系统架构相关指令
Ubutu 本机
uname
uname -a
uname -i
uname -r
lsb_release -a
lsb_release -i
lsb_release -r
Kylin Linux 部署环境<即arm64架构>
uname
uname -a
uname -i
uname -r
nkvers
查看CPU核数,它会显示逻辑核心数:
lscpu
nproc
2. ARM64交叉编译器环境搭建
1) 选定编译工具: gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <可选其他版本>
2) 源码安装交叉编译工具:
源码安装指定版本是为适配所部署的环境v8.3.0 ,笔者安装了指定版本,大家没有特殊需求可参考 3)指令安装交叉编译工具
①下载:
注1:
从arm Developer 下载指定版本编译器;
注2:
这里还可以通过百度网盘下载v8.3.0
② 安装:
解压:
tar -xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
重命名:
mv gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu aarch64-linux-gnu-8.3.0
将目标复制到指定目录下:
<一般复制到 /opt 目录下,笔者复制到 ~/path/go 目录下>
sudo cp -rf aarch64-linux-gnu-8.3.0/ /opt
or
mkdir -p ~/path/go
cp -rf aarch64-linux-gnu-8.3.0/ ~/path/go
然后在环境变量里 /etc/profile <笔者在此文件添加>或 ~/.bashrc 添加全局变量 <注意添加自己正确路径,笔者前面未重命名>
$PATH:后面路径为gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin的解压路径
sudo vim /etc/profile
#borrieguo add arm aarch64
export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
然后加载环境变量<添加在那个文件就source那个>
source /etc/profile
or
source ~/.bashrc
查看配置是否成功:输入aarch64 +TAB是否出现提示(有对应版本即表示配置成功):
查看安装路径:
which aarch64-linux-gnu-gcc-8.3.0
3) 指令安装交叉编译工具: 源码安装交叉编译工具和指令安装交叉编译工具选其中一个操作即可
指令安装自动适配本机合适版本,无需指定较为方便
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
安装后验证下是否ok,直接输aarch64- 加Tab键如果能自动补全aarch64-linux-gnu-gcc那就问题不大。
查看版本信息:
aarch64-linux-gnu-gcc -v
能查到如下图所示,说明安装完成。
查看安装路径:
which aarch64-linux-gnu-gcc
4) 编译源码测试:
为了进一步验证交叉编译器环境搭建是否搭建成功,可进行编译源码进行验证测试。(可省略)
笔者验证的是一个C++程序。main.cpp 内容如下:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
将 main.cpp 源码编译成arm64可执行文件,指令如下:
aarch64-linux-gnu-g++ -o main main.cpp
编译通过后通过file
指令查看文件类型是否是ELF:64bit LSB shared object,ARM aarch64...
。如果是,则完成源码编译。
file main
也可通过readelf -h
指令查看文件系统架构是否是AArch64
。如果是,则完成源码编译。
readelf -h main
3. Qt编译arm64环境搭建
1) 选定Qt版本: 5.12.8 <可选其他版本>
2) Qt源码下载:
因为后面要在开发板上跑Qt程序,所以必须下载Qt源码包,然后用交叉编译工具进行编译,才能得到在目标平台上可以运行的Qt SDK。笔者本机上的Qt版本为Qt5.12.8(GCC 9.3.0,64bit) ,故下载Qt5.12.8的源码,目的就是在本机上构建两个Qt环境(x86_64和arm64)。实现在本机的PC上配置ARM64的编译环境,在本机的PC上编译完成后,配置Qt交叉编译环境,然后再用Qt编译自己写的代码,最后copy部署到ARM平台上运行即可。
注1:
Qt官网下载地址
注2:
百度网盘下载v5.12.8
3) Qt源码安装:
①解压:
下载了qt-everywhere-src-5.12.8.tar.xz,然后通过xz命令解压出qt-everywhere-src-5.12.8.tar文件,再通过tar命令解压qt-everywhere-src-5.12.8.tar文件,得到文件夹:qt-everywhere-src-5.12.8。
xz -d qt-everywhere-src-5.12.8.tar.xz
tar -xvf qt-everywhere-src-5.12.8.tar
or
tar -xvf qt-everywhere-src-5.12.8.tar.xz
②定义SDK安装路径
强烈不建议在Qt源码的目录下直接进行编译,那样会污染源码所在目录。建议在Qt源码所在的同级目录下,新建一个文件夹用来存放编译过程中产生的临时文件。一定要注意源码路径不能含有中文!
创建编译过程路径:
mkdir Qt-5.12.8-build
创建最终安装路径:
mkdir Qt-5.12.8-arm64
③安装
安装准备1)
打开 qt-everywhere-src-5.12.8/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf 配置文件,并修改为如下所示内容 ,因为一会我们要用到这个里面的内容,所以我们要先修改一下这里面的编译器。
根据自己的交叉编译器来进行编译修改,本机的交叉编译器为aarch64-linux-gnu-
如下所示:
注:上面的qmake.conf文件中,如果Ubuntu有好多个交叉编译器,一定要在交叉编译器前面加绝对路径,不然就会像我一开始make的时候会出现“not found”这些错误,或者出现下面这些错误
Makefile:51: recipe for target ‘sub-corelib-make_first’ failed
make[2]: *** [sub-corelib-make_first] Error 2
make[2]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase/src’
Makefile:46: recipe for target ‘sub-src-make_first’ failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase’
Makefile:77: recipe for target ‘module-qtbase-make_first’ failed
make: *** [module-qtbase-make_first] Error 2
安装准备2)
进入Qt-5.12.8-build文件夹执行configure
./../qt-everywhere-src-5.12.8/configure -prefix /home/airobot/path/qt/Qt-5.12.8-arm64 -make libs -xplatform linux-aarch64-gnu-g++ -skip qtdeclarative -no-opengl
说明:
-prefix 代表你的安装文件夹,即上面定义的最终安装路径,注意目录要对应;
-xplatform 代表你所制定的编译器;
-no-opengl -no表示不编译该模块;跳过编译openGL(因为我已经安装了Qt,所以不需要界面);
-skip qtdeclarative 跳过 qtdeclarative编译;
其它参数:
-opensource 编译开源版 -commercial 编译商业版 (参数可选);
-static 生成静态库.a文件 -shared 生成动态库so文件 (参数可选,默认是shared)注:静态库与动态库区别是在生成目标文件的链接方式上,静态库采用静态链接,在生成的目标文件(如执行文件)中会包含库文件代码,而动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
-force-debug-info 强制生成调试信息 (参数可选)这个参数是让Qt release版本也生成.pdb文件。这个文件有什么作用呢?它就是我们在release版本下设置了异常捕获信息函数,打印出错堆栈信息所必须的文件。如果程序没用开启异常捕获选项,是不需要开启这个参数的。
-opengl dynamic 指定opengl库 (参数可选)
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。 OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。 OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
-skip 跳过该模块
-nomake 不编译该模块
-mp 启动多核编译
注:-skip和-nomake都可省略,但是-skip qtdeclarative这个参数不能省略,qtdeclarative模块有需要依赖的库,这里不跳过编译会失败。
如果有别的需求,可以./configure -help查看具体命令
也可使用“vim autoconfigure.sh”命令,新建“autoconfigure.sh”脚本,然后我们需要用 configure 生成下 Makefile,因为命令比较长,我们一般都是创建一个脚本,然后执行我们这个脚本生成 Makefile。
autoconfigure.sh 如下:
#!/bin/sh
#export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
./../qt-everywhere-src-5.12.8/configure -prefix ~/path/qt/Qt-5.12.8-arm64 \
#-static \
#-release \
-opensource \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
#-optimized-qmake \
#-pch \
#-qt-libjpeg \
#-qt-zlib \
-no-opengl \
#-skip qt3d \
#-skip qtcanvas3d \
#-skip qtpurchasing \
#-no-sse2 \
#-no-sse3 \
#-no-ssse3 \
#-no-sse4.1 \
#-no-sse4.2 \
#-no-avx \
#-no-avx2 \
#-no-mips_dsp \
#-no-mips_dspr2 \
#-qt-zlib \
#-no-openssl \
#-no-xcb \
#-no-cups \
#-no-iconv \
#-no-evdev \
#-no-icu \
#-no-fontconfig \
#-nomake examples \
#-nomake tools \
#-skip qtvirtualkeyboard \
#-qpa linuxfb \
#-no-opengl \
#-no-libinput \
#-no-gstreamer \
#-no-system-proxies \
#-no-slog2 \
#-no-lgmon \
#-linuxfb \
#-v \
#-qt-libjpeg \
#-qt-libpng \
#-no-libproxy \
#-no-dbus \
#-no-glib \
#-no-compile-examples \
-skip qtdeclarative \
修改权限:
sudo chmod +x autoconfigure.sh
执行脚本:
./autoconfigure.sh
提示选择版本,输入o,回车
询问是否接受协议,输入y,回车
安装准备3)
编译及安装
大概编译十来分钟
make -j4 2>&1 | tee build.log
make install
完成后进入~/path/qt/Qt-5.12.8-arm64/lib路径,可以查看文件属性。系统架构为AArch64
readelf -h libQt5DBus.so
这就是我们需要的东西,到时候拷贝到开发板
4. 配置 Qt的本地aarch64交叉编译器
1) 编译器(Compliers)配置:
编译器(Compliers)安装完交叉编译工具,系统能自动找到。如果找不到需要自己通过添加(Add)按钮添加
which aarch64-linux-gnu-gcc
which aarch64-linux-gnu-g++
添加步骤:
C++编译器
配置完成通过Apply按钮应用生效。
C编译器
配置完成通过Apply按钮应用生效。
2) Qt版本(Qt Versions)配置:
Qt Versions需要添加一个自定义的版本,qmake需要刚编译安装后的qmake
配置完成通过Apply按钮应用生效。
3) 构建套件(Kit)配置:
Kit需要选择好自己新添加的Qt Version和编译器。
配置完成通过Apply按钮应用生效,通过OK按钮配置完成。
5. 工程建立及编译验证
新建工程,并选择上面配置的构建套件(Kit)
编译后得到可执行文件:
可执行文件为ARM aarch64架构,验证成功!
至此,恭喜您!Qt的交叉编译环境已成功安装,可以开始使用了!!!
下一个教程将讲述: Qt教程4-Ubuntu(x86_64)上用QEMU建立arm64(aarch64)的模拟开发环境,让您编译的ARM aarch64架构的程序在本机能够实现运行验证!
后续教程还将讲述: Qt教程5-Ubuntu(x86_64)上交叉编译的QT程序SSH直接部署到远程国产系统(ARM aarch64架构),让您在本机Qt开发的ARM aarch64架构程序,通过配置 Qt的SSH aarch64交叉编译器,从而共享所要部署的环境来直接在本机Qt上实现运行验证!
感谢阅读,我是汇创慧玩,希望文章能够解决您的问题。
事为之,须极致!