基于Intel macOS修改CMake编译Apple ARM(M1/M2)兼容二进制
在Intel macOS上编译兼容Apple ARM(M1/M2)的二进制方案
要在Intel架构的Mac上编译出能在M1/M2等Apple ARM芯片上运行的二进制,只需在CMake配置中指定目标架构,同时修正原配置里的冗余和冲突项,具体修改如下:
修改后的完整CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(MyLib) # 指定目标架构为Apple ARM(arm64),要生成同时兼容Intel和ARM的通用二进制就改成"x86_64;arm64" set(CMAKE_OSX_ARCHITECTURES "arm64") set(CMAKE_CXX_STANDARD 17) # Debug模式编译参数 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g") # Release模式编译参数 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG -O3") # 通用编译参数:移除原有的-std=c++14,避免和CMAKE_CXX_STANDARD 17冲突 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") INCLUDE_REGULAR_EXPRESSION("^.*$") option(BUILD_TESTING "Build tests" ON) SET(CROSSPLATFORM_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/../../file1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../file2.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../file3.cpp ) add_library(MyLib-macOS SHARED ${CROSSPLATFORM_SRCS}) set_target_properties(MyLib-macOS PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" PREFIX "" # 开启macOS的RPATH支持,保证动态库运行时能被正确加载 MACOSX_RPATH ON )
关键修改说明
- 指定目标架构:新增
CMAKE_OSX_ARCHITECTURES变量,设置为arm64就能强制编译出ARM架构的二进制;如果需要做通用兼容(同时支持Intel和ARM),把值改成x86_64;arm64即可,生成的是fat二进制包。 - 修复C++标准冲突:原代码同时设置了
CMAKE_CXX_STANDARD 17和-std=c++14,会导致编译时标准版本冲突,直接删掉-std=c++14,保留CMAKE_CXX_STANDARD 17的配置即可。 - 清理重复配置:原代码里Debug和Release的编译参数被重复写了两遍,删掉重复部分,保持配置简洁。
- 完善动态库属性:添加
MACOSX_RPATH ON,这是macOS动态库的必要配置,能避免运行时出现库找不到的问题。
编译验证
在Intel Mac上执行以下命令编译:
mkdir build && cd build cmake .. make
编译完成后,用下面的命令验证生成的二进制架构:
lipo -info bin/MyLib-macOS
- 如果是纯ARM架构,输出会显示:
Non-fat file: bin/MyLib-macOS is architecture: arm64 - 如果是通用二进制,输出会显示:
Architectures in the fat file: bin/MyLib-macOS are: x86_64 arm64
内容的提问来源于stack exchange,提问作者Jaime
相关产品推荐
相关产品推荐

