在Apple M1(arm)设备上用CMake编译macOS-x86_64程序的正确方法?
正确实现方案
1. CMake 标准架构配置(无需手动修改编译参数)
CMake 原生提供 CMAKE_OSX_ARCHITECTURES 变量专门用于指定 macOS 构建目标架构,是官方推荐的标准方案,优先级高于手动添加的 -arch 参数,会自动传递到编译、链接全流程,不需要分别给 Debug/Release、C/C++ 单独加参数。
你可以选择以下两种方式中的任意一种配置:
- 写入顶层
CMakeLists.txt:在文件最开头(project指令之前)添加如下内容
set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Target macOS x86_64 architecture" FORCE)
- 仅在构建时传入参数,无需修改项目代码:CMake 配置阶段添加参数
-DCMAKE_OSX_ARCHITECTURES=x86_64
2. CLion IDE 适配配置(无需手动执行 arch 命令)
完成上述 CMake 配置后,只需要调整 CLion 工具链和构建配置即可完全使用 IDE 原生功能:
- 打开「偏好设置 > 构建、执行、部署 > 工具链」,新增一个工具链,命名为
x86_64 macOS,CMake 路径选择 x86 版本 brew 安装的路径(默认是/usr/local/bin/cmake),C/C++ 编译器选择对应 x86 版本的 clang/clang++ 路径(默认是/usr/local/bin/clang、/usr/local/bin/clang++),保存配置。 - 打开「偏好设置 > 构建、执行、部署 > CMake」,新增构建 Profile(如
Debug x86_64、Release x86_64),工具链选择刚才创建的x86_64 macOS,如果没有在 CMakeLists 写入架构配置,就在「CMake 选项」栏添加-DCMAKE_OSX_ARCHITECTURES=x86_64。 - 若需要在 CLion 内直接运行程序,打开对应运行配置,勾选「使用 Rosetta 运行」选项即可,无需手动加
arch -x86_64前缀。
之前手动加 -arch 参数不生效的核心原因是 CMake 默认识别宿主架构为 arm64,内置的架构配置优先级高于手动添加的编译参数,因此依然按 arm64 架构执行构建流程,才会出现链接架构不匹配的报错。
内容的提问来源于stack exchange,提问作者Wael Boutglay
相关产品推荐
相关产品推荐

