提示:文章写完后,目次可以主动生成,如何生成可参考右边的帮助文档
前言
近来有个项目使用Qt5的ARM64版,有一种方法是直接在板子上安装Qt5,这种方法最简朴,但是板子服从低一些,编译慢,画面也不太流畅以是才切换到交叉编译方向来。
这篇文章基于Ubuntu-20.04编译,板子的体系也是20.04,接下来我会给出我的编译心得,包括一些留意事项,请仔细查察,能少走不少弯路。
OS:Ubuntu-20.04 x86_64
Board:Ubuntu-20.04 aarch64
工具:aarch64-linux-gnu-9
一、重要说明
最好板子的情况和OS的情况一样,如许可以避免不须要的报错,而且由于Qt5程序依赖libc这个库,导致高版本体系编译的二进制文件放在低版本体系不能运行。
为什么选择aarch64-linux-gnu-9,因为高版本可能出现不兼容的现象,报各种错,以是建议编译器版本不要超过9,9也是可以的。
留意:这个教程5.12.8版本一次编译通过,5.15.2可能报错,QT6也不确定是否能用!
二、预备情况
1.下载qt5.12.8源代码
5.12.8下载页面
zip和tar.xz都行,只不外xz压缩率更高,建议选xz
2.配置体系情况
- sudo apt update
- sudo apt install g++-9-aarch64-linux-gnu gcc-9-aarch64-linux-gnu cmake gdb clang
复制代码 3.安装须要工具
- sudo apt install qtbase5-dev qt5-qmake qtcreator
复制代码 4.解压qt5源代码
- tar -xmf qt-everywhere-src-5.12.8.tar.xz
复制代码 5.开始配置编译
- ./configure -release -opensource -confirm-license -xplatform linux-aarch64-gnu-g++ -prefix ~/Qt5.12.8_ARM64 -nomake examples -no-opengl -silent -qpa linuxfb
复制代码 留意:这个版本不带opengl,假如你用不到opengl就可以不编译,假如你用opengl就要用另一种方法,下面会说。
这种方法可能不会编译web引擎,假如你用不到可以不消管,假如你用的到就按照它的提示追加就行了。等qmake构建好之后就可以编译了,留意使用的线程数。
6.配置qtcreator
上面已经安装好qtcreator了,打开开始配置交叉编译情况。
打开Tools->Options
Kits->Qt Versions
右边的Add会打开一个文件管理器。
找到我们编译好的Qt5.12.8_ARM64直到bin/qmake,选中打开就会添加新情况。
接着打开Kits条目,同样右边的Add
Name:随便取
Device type:和我一样
Device:和我一样
Sysroot:留空
Compiler:按照我的,肯定不要错了,选刚刚安装的arm 64bit
Debuger:gdb
Qt version:和我一样,选刚才添加的
Cmake Tool:选cmake就行了
最终Apply->Ok。
创建一个新项目或旧项目选择ARM64就可以交叉编译了,目前这个方法不能在x86_64上运行,你需要把二进制文件拷贝到aarch64设备上运行。
三、编译opengl
上面的方法没有opengl的支持,现实上我试了很多方法单纯在x86_64上编译opengl是不行的,需要借助sysroot,可以理解成你板子的rootfs。
你先去板子官方找一个rootfs,安装配置好opengl情况,背面要用。这里以firefly的rk3399为例,我把rootfs拷贝到我的Ubuntu-20.04电脑上了。
这个rootfs是可以通过qemu-user-static软件模拟情况的,这个就不细说了,一样寻常支持定制的板子厂商的维基里都会说明的。
上面的软件照样装,流程照样走一边,只是到了构建的时候命令变了:
- ./configure -sysroot ~/firefly-rk3399-ubuntu2004-rootfs -release -opensource -confirm-license -xplatform linux-aarch64-gnu-g++ -extprefix ~/Qt5.12.8_ARM64 -nomake examples -opengl -silent -qpa linuxfb
复制代码 -sysroot:指定你自己的rootfs目次
-extprefix:这个叫外部安装路径,要否则编译好的安装到rootfs里面去了
-opengl:指定编译opengl Desktop,根据自己需要编译
等待构建完成…
贴下我的构建输出:
OpenGL:
Desktop OpenGL … yes
OpenGL ES 2.0 … no
OpenGL ES 3.0 … no
OpenGL ES 3.1 … no
OpenGL ES 3.2 … no
按照我的方法Desktop OpenGL必然为yes才算成功,你要是需要es2就加es2,你要确定你的rootfs支持es2否则编译不通过。
我这种方法不是完全编译,包罗了大多数我能用到的组件,要想知道QT支持哪些组件,你只需要实行下面的命令挨个看。
- cat qtbase/config_help.txt
复制代码 比如OpenGL
- -gtk ................. Enable GTK platform theme support [auto]
- -lgmon ............... Enable lgmon support [auto] (QNX only)
- -no-opengl ........... Disable OpenGL support
- -opengl <api> ........ Enable OpenGL support. Supported APIs:
- es2 (default on Windows), desktop (default on Unix),
- dynamic (Windows only)
- -opengles3 ........... Enable OpenGL ES 3.x support instead of ES 2.x [auto]
- -egl ................. Enable EGL support [auto]
- -angle ............... Use bundled ANGLE to support OpenGL ES 2.0 [auto]
- (Windows only)
- -combined-angle-lib .. Merge LibEGL and LibGLESv2 into LibANGLE (Windows only)
- -qpa <name> .......... Select default QPA backend(s) (e.g., xcb, cocoa, windows)
- A prioritized list separated by semi-colons.
复制代码 至于怎么选就看你自己了,假如报错的话大概率是sysroot的标题,你需要多检查几遍,大概评论我们一起探讨下。
总结
1、自己并不难,找到诀窍才是重要的,选不对版本和工具链够头疼的,还是那句话:尽量维持情况同等性。
2、组件很多,编译也不快,最好还是知道哪些组件自己用得到省得反复编译耗时。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |