曹旭辉 发表于 2024-7-24 10:04:36

利用 Ubuntu x86_64 平台交织编译实用于 Linux aarch64(arm64) 平台的 QT5(

利用 Ubuntu AMD64 平台交织编译实用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库



写在前面

假如你的项目目的平台为 ARM 指令集的 Linux 系统且需要用到 QT 库,惋惜 QT 官方并未提供对应已编译完成的二进制版本库文件,这时我们只能本身下载 QT 源码自行编译。假如你手上没有 ARM 平台的装备,而 ARM 假造机的创建也不是很方便,这时需要利用交织编译工具举行跨平台编译。由于 QT 库的巨大,整个编译过程可谓是相当的曲折,本文为我通过各种渠道查找资料解决题目终极实现编译的经验整理,如有错误请在评论区指出。

   本文实用以下情况:

[*]编译平台为 Ubuntu AMD64(也称 x86_64 其他 Linux 系统应该也行)
[*]目的平台为 Linux ARM64
[*]QT 库版本为 5.12.11(其他版本没有测试过)
[*]利用交织编译工具举行跨平台编译
前期预备

一. 编译平台搭建
我利用的是 Ubuntu VMWare 假造机,版本为 Ubuntu 22.04.4 LTS,搭建过程本文不赘述。

二. 下载 QT 源码包
官网下载地址:https://download.qt.io/archive/qt/ (大概需要梯子)
【选择版本】 >> 【进入 single/ 目次】 >> 【点击 qt-everywhere-src-5.12.11.tar.xz 开始下载】

三. 预备目的平台的 OpenGL 支持库
留意这里需要的是目的平台的 OpenGL 库,而不是编译平台的,可以在网上下载别人编译好的,或者搭建目的平台的假造机安装后复制出来,步调参考本文附录。
编译全流程

1. 情况搭建

安装编译所需的依赖情况 参考链接:
根本情况:
sudo apt-get install libxcb-xinerama0-dev build-essential perl git python2
交织工具链:
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
Libxcb:
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
OpenGL:
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev libegl1-mesa-dev libgles2-mesa-dev freeglut3-dev
以下情况根据需求安装:
Qt WebKit 依赖
sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
Qt WebEngine 依赖
sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libdbus-1-dev libfontconfig1-dev libcap-dev libxtst-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libxss-dev libegl1-mesa-dev gperf bison
Qt Multimedia 依赖
sudo apt-get install libasound2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
QDoc Documentation Generator Tool 依赖
sudo apt-get install clang libclang-dev llvm
安装好的 Python2 其控制台指令为 python2,QT 需要识别的指令为 python,以是需要创建一个指向 python2 的软链接
sudo ln -s /usr/bin/python2 /usr/bin/python
https://img-blog.csdnimg.cn/direct/f24d470133c7489aa409b17e87e56abb.png
2. 复制源码包并解压,创建文件目次

复制下载好的 QT 源码包到编译平台,新建两个文件夹,src 用于存放解压后的 QT 源码,qt_5.12.11 用于存放终极生成的库文件。https://img-blog.csdnimg.cn/direct/d3dcc8f77426418daae34a6be48aaa01.png#pic_center
将源码包解压到 src 目次https://img-blog.csdnimg.cn/direct/ae5fa138308a4282b08708623b7b507f.png#pic_center
将 Linux ARM64 版本的 OpenGL 库添加到本地路径备用。我这里选择 ~/env/opengl_arm64,内含两个文件夹,include 用于放头文件 lib 用于放库文件。这里的 ~ 表示用户主目次,也就是 /home/<username> 对应的目次,后续在配置中涉及到填写该目次的情况同等接纳 /home/<username> 的形式,不要利用 ~ 否则会堕落。
颠末我的测试,直接解压出的源码包在编译时会报错 error:'numeric_limits' is not a member of 'std' 缘故原由是缺少一个头文件包含,找到以下几个头文件,在其中添加 #include <limits> 即可。
src/qtbase/src/corelib/global/qendian.h
src/qtbase/src/corelib/tools/qbytearraymatcher.h
src/qtbase/src/tools/moc/generator.h
src/qtdeclarative/src/qml/jsruntime/qv4propertykey_p.h
src/qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h
3. 编辑配置

进入源码目次下的 qtbase/mkspecs/linux-aarch64-gnu-g++,编辑 qmake.conf 文件。这里 linux-aarch64-gnu-g++ 文件夹对应 Linux ARM64 平台的编译配置。在图示位置新增以下内容(由于头文件不分平台且本机也安装了 OpenGL 情况,以是可以直接 /usr/include/xxx 作为头文件路径):
QMAKE_INCDIR_OPENGL_ES2 = /usr/include/GLES2
QMAKE_LIBDIR_OPENGL_ES2 = /home/neko/env/opengl_arm64/lib
QMAKE_INCDIR_EGL      = /usr/include/GEL
QMAKE_LIBDIR_EGL      = /home/neko/env/opengl_arm64/lib
QMAKE_LIBS_EGL         += -lEGL -lGLESv2
QMAKE_LIBS_OPENGL_ES2+= -lGLESv2 -lEGL
https://img-blog.csdnimg.cn/direct/70a72dc2eb5541c596af69f2fa70cbd0.png
回到源码目次,利用 touch autoconfig.sh 命令新建主动配置脚本。编辑脚本写入如下内容:
./configure -prefix ~/workspace/compile/qt_5.12.11 \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-xplatform linux-aarch64-gnu-g++ \
-optimized-qmake \
-c++std c++11 \
-pch \
-linuxfb \
-make libs \
-nomake examples \
-nomake tests \
-gui \
-widgets \
-dbus-runtime \
--rpath=no \
--glib=no \
--xcb=no \
-iconv \
--pcre=qt \
--zlib=qt \
--freetype=qt \
--harfbuzz=qt \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-opengl es2 \
-plugin-sql-sqlite \
-recheck-all
脚本内容说明:
./configure -prefix ~/workspace/compile/qt_5.12.11 \        # 指定最终生成目录,就是前面创建的 qt_5.12.11
-opensource \                                                                                        # 指定编译开源版本
-confirm-license \                                                                                # 确认许可证,同意使用条款
-release \                                                                                                # 指定编译 Release 版本
-strip \                                                                                                # 去掉生成的二进制文件中的符号表,以减小文件大小
-shared \                                                                                                # 生成共享库(动态链接库)
-xplatform linux-aarch64-gnu-g++ \                                                # 使用 Linux ARM64 对应的平台配置
-optimized-qmake \                                                                                # 生成优化过的 qmake 工具
-c++std c++11 \                                                                                        # 使用 C++11 标准进行编译
-pch \                                                                                                        # 使用预编译头,提高编译速度
-linuxfb \                                                                                                # 启用 Linux framebuffer 支持,用于在没有 X11 的环境中直接在 framebuffer 上绘制图形
-make libs \                                                                                        # 编译库文件
-nomake examples \                                                                                # 不编译示例程序
-nomake tests \                                                                                        # 不编译测试程序
-gui \                                                                                                        # 包含 GUI 模块
-widgets \                                                                                                # 包含 Widgets 模块
-dbus-runtime \                                                                                        # 启用 D-Bus 支持,使用运行时检测
--rpath=no \                                                                                        # 禁用 RPATH,支持通过手动设置 LD_LIBRARY_PATH 解决库查找问题
--glib=no \                                                                                                # 禁用 GLib 支持
--xcb=no \                                                                                                # 禁用 XCB(X C Binding)支持
-iconv \                                                                                                # 启用 iconv 库支持,iconv 用于字符编码转换
--pcre=qt \                                                                                                # 使用 Qt 自带的 PCRE 库
--zlib=qt \                                                                                                # 使用 Qt 自带的 Zlib 库
--freetype=qt \                                                                                        # 使用 Qt 自带的 FreeType 库
--harfbuzz=qt \                                                                                        # 使用 Qt 自带的 HarfBuzz 库
--libpng=qt \                                                                                        # 使用 Qt 自带的 libpng 库
--libjpeg=qt \                                                                                        # 使用 Qt 自带的 libjpeg 库
--sqlite=qt \                                                                                        # 使用 Qt 自带的 SQLite 库
-opengl es2 \                                                                                        # 使用 OpenGL ES 2.0 进行图形渲染
-plugin-sql-sqlite \                                                                        # 启用 SQLite SQL 插件支持
-recheck-all                                                                                        # 重新检查所有配置选项,确保其正确无误
利用 chmod +x ./autoconfig.sh 赋予该脚本文件执行权限,利用 ./autoconfig.sh 运行该文件,等待构建竣事。
https://img-blog.csdnimg.cn/direct/b0e9846e00a74157a79015a1c504c7f6.png
该过程会检查情况支持情况以及配置是否精确等,竣事时正常情况应该和下图显示的同等,没有 Error,如有题目请参照下面的常见题目解决办法处理,若遇到新的其他题目请在评论区指出。
https://img-blog.csdnimg.cn/direct/03a64d6e49694a1b900639abdca80b0a.png
4. 开始编译,安装

控制台当前目次处于源码目次,输入 gmake 开始编译,编译过程很漫长,受限于机器性能,大概长达数小时。可以利用 gmake -j4 利用4线程或更多线程举行编译以提升速度,但是堕落后不好定位。
前面建立了 Python 软链接而且修改了缺少 #include <limits> 的头文件,编译过程应该不会出题目了,我这里是如许。
等待编译竣事后,输入 gmake install 在指定的 qt_5.12.11 文件夹里生成库文件和其他工具等。
常见题目及解决办法

① WARNING: Python version 2 (2.7.5 or later) is required to build QtWebEngine.
sudo apt-get install python2
② ERROR: Feature ‘opengles2’ was enabled, but the pre-condition ‘config.win32 || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)’ failed.
ERROR: The OpenGL functionality tests failed!
查看步骤【3. 编辑配置】
检查是否修改了对应目标平台的 qmake.conf 文件;文件设置的路径是否正确;路径中的库文件是否为目标平台的库文件
可使用 readelf -h filename 查看文件架构信息
③ 编译报错:error:‘numeric_limits’ is not a member of ‘std’
参照步骤【2. 复制源码包并解压,创建文件目录】,在报错的头文件中添加 #include <limits> 包含命令
附录

Ubuntu 系统中利用 QEMU 安装 ARM 假造机的方法

// TODO: 待美满

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 利用 Ubuntu x86_64 平台交织编译实用于 Linux aarch64(arm64) 平台的 QT5(