Qt5适配M1

 大部分情况下Qt的x86应用程序可以运行于M1的 Rosetta之上,但是当我们基于Qt的应用程序依赖仅仅支持Arm64架构的库时就无法链接通过了.当前时间点为2021年8月份Qt尚未提供支持M1的免费发布版本,Qt 6.2有一个Preview版本支持M1,但普通用户有使用期限,且Preview版本并不是稳定版用上去有风险.

 

1、编译M1版本的Qt(5.15.2版本)

    参考 https://www.reddit.com/r/QtFramework/comments/ll58wg/how_to_build_qt_creator_for_macos_arm64_a_guide/ (此网站可能需要fan qiang,第一部分内容主要就是翻译翻译)

 

其主要步骤如下:

在M1电脑上(X86电脑相同的编译选项无法编译通过)

 安装必备的工具

            编译Qt lib需要安装: brew install pcre2 harfbuzz freetype

            编译Qt creator需要安装:

                                      brew install cmake ninja python

                                      brew install --build-from-source llvm

 

下载 Qt 5.15.2的源码:https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz                                   (.zip的包是windows版本的,不要下载zip的包)

 

解压此压缩包,在压缩包解压文件夹同一层目录创建构建目录:

          mkdir  buildir

然后在同一层目录下创建编译目标路径

          mkdir outDir

进入构建目录 

       cd  buildir

 

编译配置

       ../qt-everywhere-src-5.15.2/configure -release -prefix ./outDir -nomake examples -nomake tests QMAKE_APPLE_DEVICE_ARCHS=arm64 -opensource -confirm-license -skip qt3d -skip qtwebengine

 

编译

       make -j15

安装

        make install

 

此时在 outDir目录下就有一套完整的Qt工具集和库(没有3D模块)

 

2、制作universal版Qt

 此时编译的Qt可以在M1电脑上编译大部分的工程,但却无法运行于x86电脑上.为了让x86电脑上也能编译运行于arm64版本的Qt,需要将Qt制作成为universal的Qt.

 

 在一台x86的Mac电脑上同步骤1进行安装工具,编译Qt等操作,唯一不一样的是编译配置,在x86下应该用

      ../qt-everywhere-src-5.15.2/configure -release -prefix ./outDir -nomake examples -nomake tests QMAKE_APPLE_DEVICE_ARCHS=x86_64 -opensource -confirm-license -skip qt3d -skip qtwebengine

 

做成x86版本的Qt后需要将两个Qt版本合并为universal版Qt,参考 https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary  可以知道用lipo 工具可以将arm与x86程序融合成universal版本程序,Qt的工具集很多,一个一个操作相当费时.

GitHub上有个工具相当方便 https://github.com/nedrysoft/makeuniversal,用makeuniversal工具可以合并两个文件夹为univerdal.

 

./makeuniversal   ./qt5-mac-universal ./qt5-mac-x86_64  ./qt5-mac-arm64 

其中 qt5-mac-x86_64为之前编译的x86版本Qt工具与lib集,qt5-mac-arm64 为之前编译arm64工具与lib集,命令执行成功后 qt5-mac-universal路径下就是支持两个平台的Qt工具与lib集 .

 

3、编译universal 程序

使用上面做成的universal的Qt工具集像往常一样创建Qt工程,然后在Qt工程配置文件xxx.pro文件里添加一句

  QMAKE_APPLE_DEVICE_ARCHS="x86_64 x86_64h"

即告诉编译系统要编译支持两个平台的app,编译成功后生成的app就已经支持在两个平台上运行了.

 

posted @ 2021-08-13 20:19  wqc_wood  阅读(5380)  评论(3编辑  收藏  举报