大部分情况下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就已经支持在两个平台上运行了.