使用 Ubuntu x86_64 平台交叉编译适用于 Linux aarch64(arm64) 平台的 QT5(包含OpenGL/WebEngine支持) 库

使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库

目录

  • 使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库
    • 写在前面
    • 前期准备
    • 编译全流程
      • 1. 环境搭建
      • 2. 复制源码包并解压,创建文件目录
      • 3. 编辑配置
      • 4. 开始编译,安装
    • 常见问题及解决办法
    • 附录
      • Ubuntu 系统中使用 QEMU 安装 ARM 虚拟机的方法

写在前面

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

本文适用以下情况:

  1. 编译平台为 Ubuntu AMD64(也称 x86_64 其他 Linux 系统应该也行)
  2. 目标平台为 Linux ARM64
  3. QT 库版本为 5.12.11(其他版本没有测试过)
  4. 使用交叉编译工具进行跨平台编译

前期准备

一. 编译平台搭建
我使用的是 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

在这里插入图片描述

2. 复制源码包并解压,创建文件目录

复制下载好的 QT 源码包到编译平台,新建两个文件夹,src 用于存放解压后的 QT 源码,qt_5.12.11 用于存放最终生成的库文件。在这里插入图片描述
将源码包解压到 src 目录在这里插入图片描述
将 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

在这里插入图片描述

回到源码目录,使用 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 运行该文件,等待构建结束。

在这里插入图片描述

该过程会检查环境支持情况以及配置是否正确等,结束时正常情况应该和下图显示的一致,没有 Error,如有问题请参照下面的常见问题解决办法处理,若遇到新的其他问题请在评论区指出。

在这里插入图片描述

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: 待完善

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PrestaShop的目录结构详解

admin-dev&#xff1a;这个目录通常包含开发和测试PrestaShop后台时所需的脚本和配置文件。例如&#xff0c;它可能包含用于测试API的脚本或用于在开发过程中快速访问某些后台功能的快捷方式。 app&#xff1a;这个目录是PrestaShop的核心&#xff0c;包含了许多关键的组件。例…

解决HTTP 400 Bad Request错误的方法

解决HTTP 400 Bad Request错误的方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在进行网络通信时&#xff0c;HTTP 400 Bad Request错误是相对常见的问题…

在Mac上恢复丢失或未保存的Word文档的5种有效方法

“救命&#xff01;我想在Mac上恢复丢失的Word文档。就在 1 小时前&#xff0c;我错误地删除了它们&#xff0c;并清空了垃圾桶。这些Word文档对我来说非常重要。我不知道如何恢复它们&#xff0c;谁能帮我&#xff1f;提前致谢&#xff01; 没有什么比忘记保存 Word 文档或在…

3d模型里地毯的材质怎么赋予?---模大狮模型网

在进行3D建模时&#xff0c;赋予地毯逼真的材质是营造现实感和增强场景氛围的重要步骤。模大狮将介绍在常见的3D建模软件中&#xff0c;如何有效地为地毯赋予各种材质&#xff0c;以及一些实用的技巧和注意事项。 一、选择合适的地毯材质 在3D建模中&#xff0c;地毯的材质选择…

Spring Boot与WebFlux的实战案例

Spring Boot与WebFlux的实战案例 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何利用Spring Boot和WebFlux构建响应式应用的实战…

MySQL之可扩展性(七)

可扩展性 通过集群扩展 理想的扩展方案时单一逻辑数据库能够存储尽可能多的数据&#xff0c;处理尽可能多的查询&#xff0c;并如期望的那样增长。许多人的第一想法就是建立一个"集群"或者"网格"来无缝处理这些事情&#xff0c;这样应用就无须去做太多工…

LangServe APIHandler:定制化LangChain REST API

LangServe&#xff0c;这一创新性的工具&#xff0c;专为简化LangChain对象及链的部署而生&#xff0c;将它们转化为REST API&#xff0c;从而赋能开发人员构建更为敏捷高效的应用。与FastAPI的深度融合以及Pydantic的精准数据验证&#xff0c;使得LangServe成为构建微服务的理…

K8S中的某个容器突然出现内存和CPU占用过高的情况解决办法

当K8S中的某个容器突然出现内存和CPU占用过高的情况时&#xff0c;可以采取以下步骤进行处理&#xff1a; 观察和分析&#xff1a; 使用kubectl top pods命令查看集群中各个Pod的CPU和内存占用情况&#xff0c;找出占用资源高的Pod。使用kubectl describe pod <pod-name>…

双向长短期记忆神经网络BiLSTM

先说一下LSTM LSTM 是一种特殊的 RNN&#xff0c;它通过引入门控机制来解决传统 RNN 的长期依赖问题。 LSTM 的结构包含以下几个关键组件&#xff1a; 输入门&#xff08;input gate&#xff09;&#xff1a;决定当前时间步的输入信息对细胞状态的影响程度。遗忘门&#xff…

C盘满了怎么办?用这方法彻底拯救你的C盘

C盘满了怎么办&#xff1f;用这方法彻底拯救你的C盘。我们的C盘是整个电脑运行的核心部分&#xff0c;里面装载了很重要的系统框架和数据&#xff0c;由于使用的时间越来越长&#xff0c;C盘也会积累很多的垃圾&#xff0c;这样就经常容易出现爆满的情况。 对于C盘爆满&#x…

扫扫地,搞搞卫生 ≠ 车间5S管理

在制造业的日常运营中&#xff0c;车间管理是一项至关重要的工作&#xff0c;它直接关系到生产效率、产品质量以及员工的工作环境。然而&#xff0c;许多人常常将简单的“扫扫地&#xff0c;搞搞卫生”等同于车间5S管理&#xff0c;这种误解不仅可能导致管理效果不佳&#xff0…

Halcon 如何让图像自适应窗口

一 如何让图像自适应窗口 read_image(Image,1)get_image_size(Image,Width, Height)dev_close_window()dev_open_window(0,0,Width/2,Height/2,black,WindowHandle)dev_set_part(0,0,Height-800,Width-800)dev_display(Image)二 如何实现彩色图像转化为灰色图像 read_image(I…

浅谈逻辑控制器之Switch控制器

浅谈逻辑控制器之Switch控制器 Switch Controller是Apache JMeter中一个强大的逻辑控制器&#xff0c;它允许用户基于特定的变量值或参数来控制哪些子采样器被执行。与简单地按照配置顺序执行的控制器不同&#xff0c;Switch Controller根据提供的“switch value”来决定执行哪…

鸿蒙HCIP应用开发学什么?

HCIP-HarmonyOS Application Developer 课程大纲 一&#xff1a;HarmonyOS 系统介绍 -&#xff08;3 课时&#xff09; - 系统及应用场景介绍&#xff1b;HarmonyOS 系统介绍&#xff1b;HarmonyOS 定义 HarmonyOS 特征&#xff1b; - 统- OS&#xff0c;弹性部署&#xff1b…

深度相机识别物体——实现数据集准备与数据集分割

一、数据集准备——Labelimg进行标定 1.安装labelimg——pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple 2.建立相应的数据集存放文件夹 3.打开labelimg&#xff0c;直接在命令行输入labelimg即可&#xff0c;并初始化 4.开始标注&#xff0c;设置标注好…

【高考志愿】自动化

目录 一、专业概述 二、课程设计 三、就业前景与方向 四、志愿填报 五、自动化专业排名 一、专业概述 高考志愿自动化专业选择&#xff0c;无疑是迈向现代化工业与科技发展的一把金钥匙。自动化专业&#xff0c;作为现代工程领域的重要支柱&#xff0c;融合了计算机、电子…

Streams.js:简化 JavaScript 数据流处理

在现代的 Web 开发中&#xff0c;数据流处理是一个常见的需求。从处理用户输入到处理大规模数据集&#xff0c;JavaScript 开发者需要一种有效的方式来处理和转换数据流。Streams.js 是一个优秀的 JavaScript 库&#xff0c;提供了强大的工具来简化数据流处理的复杂性。 什么是…

宝兰德开源多款仓颉产品组件,共筑新语言生态

2024年6月21日下午&#xff0c;华为终端BG软件部总裁龚体先生在华为开发者大会主题演讲《鸿蒙原生应用&#xff0c;全新出发&#xff01;》中向全球开发者介绍了华为自研仓颉编程语言&#xff0c;并发布了HarmonyOS NEXT仓颉语言开发者预览版。这是华为首次公开发布仓颉编程语言…

【人工智能学习之图像操作(三)】

【人工智能学习之图像操作&#xff08;三&#xff09;】 图像滤波滤波概念卷积平滑算子均值滤波高斯滤波中值滤波双边滤波锐化算子USM锐化梯度算子 傅里叶变换直方图直方图直方图均衡化自适应均衡化2D 直方图直方图反向投影 图像滤波 滤波概念 滤波过程就是把不需要的信号频率…

OpenGL系列(六)摄像机

在 OpenGL系列&#xff08;六&#xff09;变换 中&#xff0c;一个目标物体经过模型矩阵、观察矩阵和投影矩阵的变换才能正常显示出来&#xff0c;其中模型矩阵主要针对目标物体&#xff0c;它会影响物体的位姿。观察矩阵和投影矩阵主要针对观察者而已&#xff0c;这两个变换决…