♿︎ 引言


导师那边有个框架之前我都是在老电脑的VS上用的(之前也只有VS版),然而最近发布的新版本使用了CMake。众所周知,CMake是一款跨平台编译工具,像CLion就是使用CMake进行编译的。Mac人狂喜,然而被学长告知框架所需的Qt目前只支持x86,arm版的需要自己编译。可以自己编译的关键一点是,Qt是开源的,我们可以获得其源码。那么简单地来说,虽然直接下载下来的Qt是x86版的,但只要将其源码在自己电脑编译一遍,生成的就是适配自己电脑的版本啦。

这就不得不提到makefile文件。该文件是Linux下的一个工程管理文件,类似CMake文件,指出了如何编译软件的规则,有着自己专门的语法。但我目前也不是很了解,只是刚刚入门,以后有机会的话再讲吧。


版本信息

  • Qt 5.15.2
  • CLion 2021.3.4
  • MacOS Monterey 12.3

⩙ BUILD

  1. 打开terminal,使用homebrew(默认已有)安装依赖项
brew install pcre2 harfbuzz freetype
#下面这一项可能不需要,保险起见就安上
brew install cmake ninja python
  1. 下载Qt 5.15.2的源码,通道在此
  2. 假设下载的压缩包qt-everywhere-src-5.15.2.tar.xz所在文件夹的绝对路径为path,在terminal内
cd path
#解压压缩包
x qt-everywhere-src-5.15.2.tar.xz
#创建文件夹buildir
mkdir buildir
cd buildir
#设置arm64版编译并生成makefile
../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
#接下来会生成很多命令,不用管
  1. make命令之前我们需要消除两个问题(当然直接打开文件改也行,下面是在terminal中用vim修改)
  • 首先打开第一个更改文件,path是上面那个绝对路径
vim path/qt-everywhere-src-5.15.2/qtbase/src/plugins/platforms/cocoa/qiosurfacegraphicsbuffer.h

找到下面的语句块

#include <qpa/qplatformgraphicsbuffer.h>
#include <private/qcore_mac_p.h>

进入vim的插入模式,在该语句块前加上

#include <CoreGraphics/CGColorSpace.h>

最后应该是这样子的

改完后保存退出:esc+输入:wq

  • 打开第二个更改文件
vim path/qt-everywhere-src-5.15.2/qtlocation/include/QtLocation/5.15.2/QtLocation/private/../../../../../src/location/declarativemaps/qdeclarativepolylinemapitem_p_p.h

输入:set number后显示行号,然后将523行处的typedef struct {改为typedef struct MapPolylineEntry {,改完后保存退出

  1. 接下来开启所有进程进行编译
#在buildir目录下
make -j$(nproc)
  1. 上步完成后开始安装
make install -j$(nproc)
  1. 安装完成后可以把和buildir同层目录内的qt-everywhere-src-5.15.2.tar.xzqt-everywhere-src-5.15.2给删了
  2. 此时arm64版Qt算是安装完成(buildir),接下来(可以忽略)是在CLion上的iGameMeshView工程中使用Qt
  3. 修改iGameMeshView的cmake文件
# MacOS
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
    message(STATUS "编译器是AppleClang")
    #设置QT的目录
    set(Qt5Core_DIR path/buildir/outDir/lib/cmake/Qt5Core)
    set(Qt5Gui_DIR path/buildir/outDir/lib/cmake/Qt5Gui)
    set(Qt5OpenGL_DIR path/buildir/outDir/lib/cmake/Qt5OpenGL)
    set(Qt5Widgets_DIR path/buildir/outDir/lib/cmake/Qt5Widgets)
  1. 完成

「Reference」