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

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

利用 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. 情况搭建

安装编译所需的依赖情况 参考链接:
根本情况:
  1. sudo apt-get install libxcb-xinerama0-dev build-essential perl git python2
复制代码
交织工具链:
  1. sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
复制代码
Libxcb:
  1. sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
复制代码
OpenGL:
  1. sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev libegl1-mesa-dev libgles2-mesa-dev freeglut3-dev
复制代码
以下情况根据需求安装:
Qt WebKit 依赖
  1. sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
复制代码
Qt WebEngine 依赖
  1. 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 依赖
  1. sudo apt-get install libasound2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
复制代码
QDoc Documentation Generator Tool 依赖
  1. sudo apt-get install clang libclang-dev llvm
复制代码
安装好的 Python2 其控制台指令为 python2,QT 需要识别的指令为 python,以是需要创建一个指向 python2 的软链接
  1. 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> 即可。
  1. src/qtbase/src/corelib/global/qendian.h
  2. src/qtbase/src/corelib/tools/qbytearraymatcher.h
  3. src/qtbase/src/tools/moc/generator.h
  4. src/qtdeclarative/src/qml/jsruntime/qv4propertykey_p.h
  5. 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 作为头文件路径):
  1. QMAKE_INCDIR_OPENGL_ES2 = /usr/include/GLES2
  2. QMAKE_LIBDIR_OPENGL_ES2 = /home/neko/env/opengl_arm64/lib
  3. QMAKE_INCDIR_EGL        = /usr/include/GEL
  4. QMAKE_LIBDIR_EGL        = /home/neko/env/opengl_arm64/lib
  5. QMAKE_LIBS_EGL         += -lEGL -lGLESv2
  6. QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL
复制代码

回到源码目次,利用 touch autoconfig.sh 命令新建主动配置脚本。编辑脚本写入如下内容:
  1. ./configure -prefix ~/workspace/compile/qt_5.12.11 \
  2. -opensource \
  3. -confirm-license \
  4. -release \
  5. -strip \
  6. -shared \
  7. -xplatform linux-aarch64-gnu-g++ \
  8. -optimized-qmake \
  9. -c++std c++11 \
  10. -pch \
  11. -linuxfb \
  12. -make libs \
  13. -nomake examples \
  14. -nomake tests \
  15. -gui \
  16. -widgets \
  17. -dbus-runtime \
  18. --rpath=no \
  19. --glib=no \
  20. --xcb=no \
  21. -iconv \
  22. --pcre=qt \
  23. --zlib=qt \
  24. --freetype=qt \
  25. --harfbuzz=qt \
  26. --libpng=qt \
  27. --libjpeg=qt \
  28. --sqlite=qt \
  29. -opengl es2 \
  30. -plugin-sql-sqlite \
  31. -recheck-all
复制代码
脚本内容说明:
  1. ./configure -prefix ~/workspace/compile/qt_5.12.11 \        # 指定最终生成目录,就是前面创建的 qt_5.12.11
  2. -opensource \                                                                                        # 指定编译开源版本
  3. -confirm-license \                                                                                # 确认许可证,同意使用条款
  4. -release \                                                                                                # 指定编译 Release 版本
  5. -strip \                                                                                                # 去掉生成的二进制文件中的符号表,以减小文件大小
  6. -shared \                                                                                                # 生成共享库(动态链接库)
  7. -xplatform linux-aarch64-gnu-g++ \                                                # 使用 Linux ARM64 对应的平台配置
  8. -optimized-qmake \                                                                                # 生成优化过的 qmake 工具
  9. -c++std c++11 \                                                                                        # 使用 C++11 标准进行编译
  10. -pch \                                                                                                        # 使用预编译头,提高编译速度
  11. -linuxfb \                                                                                                # 启用 Linux framebuffer 支持,用于在没有 X11 的环境中直接在 framebuffer 上绘制图形
  12. -make libs \                                                                                        # 编译库文件
  13. -nomake examples \                                                                                # 不编译示例程序
  14. -nomake tests \                                                                                        # 不编译测试程序
  15. -gui \                                                                                                        # 包含 GUI 模块
  16. -widgets \                                                                                                # 包含 Widgets 模块
  17. -dbus-runtime \                                                                                        # 启用 D-Bus 支持,使用运行时检测
  18. --rpath=no \                                                                                        # 禁用 RPATH,支持通过手动设置 LD_LIBRARY_PATH 解决库查找问题
  19. --glib=no \                                                                                                # 禁用 GLib 支持
  20. --xcb=no \                                                                                                # 禁用 XCB(X C Binding)支持
  21. -iconv \                                                                                                # 启用 iconv 库支持,iconv 用于字符编码转换
  22. --pcre=qt \                                                                                                # 使用 Qt 自带的 PCRE 库
  23. --zlib=qt \                                                                                                # 使用 Qt 自带的 Zlib 库
  24. --freetype=qt \                                                                                        # 使用 Qt 自带的 FreeType 库
  25. --harfbuzz=qt \                                                                                        # 使用 Qt 自带的 HarfBuzz 库
  26. --libpng=qt \                                                                                        # 使用 Qt 自带的 libpng 库
  27. --libjpeg=qt \                                                                                        # 使用 Qt 自带的 libjpeg 库
  28. --sqlite=qt \                                                                                        # 使用 Qt 自带的 SQLite 库
  29. -opengl es2 \                                                                                        # 使用 OpenGL ES 2.0 进行图形渲染
  30. -plugin-sql-sqlite \                                                                        # 启用 SQLite SQL 插件支持
  31. -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.
  1. 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!

  1. 查看步骤【3. 编辑配置】
  2. 检查是否修改了对应目标平台的 qmake.conf 文件;文件设置的路径是否正确;路径中的库文件是否为目标平台的库文件
  3. 可使用 readelf -h filename 查看文件架构信息
复制代码
③ 编译报错:error:‘numeric_limits’ is not a member of ‘std’
  1. 参照步骤【2. 复制源码包并解压,创建文件目录】,在报错的头文件中添加 #include <limits> 包含命令
复制代码
附录

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

// TODO: 待美满

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表