大部分情況下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就已經支持在兩個平台上運行了.