- Creator 版本: 3.8.8
- 目标平台:ios
问题就是标题中写到的这样,附上我和deepseek搞了一天后总结出来的尝试过程和结果
Cocos Creator 3.8.x Apple Silicon 模拟器适配记录
日期:2026-07-09
引擎:Cocos Creator 3.8.6 → 3.8.7 → 3.8.8
Mac:Apple Silicon (ARM64)
Xcode:26.6
iOS SDK:26.5
一、背景
Cocos Creator 3.8.x 的 iOS 原生构建(native/CMake + C++ 引擎)从设计上只适配了 Intel Mac 模拟器(x86_64)和真机(arm64),未完成对 Apple Silicon Mac 模拟器(arm64-simulator)的支持。本文记录了尝试让它在 Apple Silicon 模拟器上运行的全过程。
二、涉及的文件与修改
2.1
编译错误:EventTarget.h template 语法
** 文件 **:/Applications/Cocos/Creator/3.8.x/CocosCreator.app/Contents/Resources/resources/3d/engine/native/cocos/core/event/EventTarget.h
** 问题 **:第 317、322 行 this->template addEventListener(...) 缺少模板参数 <TgtEvent, Fn>,Xcode 16+ 的 Clang 严格检查拒绝通过。
** 解决 **:升级到 Cocos Creator 3.8.7+ 即可(官方已修复)。
2.2
编译错误:half.h 非法特化 std 类型
** 文件 **:/Applications/Cocos/Creator/3.8.x/CocosCreator.app/Contents/Resources/resources/3d/engine/native/external/sources/enoki/half.h
** 问题 **:第 23-25 行对 std::is_floating_point、std::is_arithmetic、std::is_signed 做了显式模板特化,C++ 标准不允许用户特化这些标准库实体,Xcode 16+ 强制禁止。
** 修改 **:删除第 22-26 行(整个 NAMESPACE_BEGIN(std) ... NAMESPACE_END(std) 块)。
2.3
模拟器设备不可见
** 文件 **:/Applications/Cocos/Creator/3.8.x/CocosCreator.app/Contents/Resources/resources/3d/engine/templates/cmake/apple.cmake
** 问题 **:
- 原代码第 99 行:
EXCLUDED_ARCHS[sdk=iphonesimulator*] = "arm64"
这导致 Apple Silicon Mac 上模拟器架构被排空、Xcode 不显示任何模拟器设备。
- 原代码第 89 行:
ONLY_ACTIVE_ARCH = YES
配合 EXCLUDED_ARCHS 进一步加剧了设备隐藏。
** 修改 **:
# 模拟器仅使用 arm64(Apple Silicon 原生)
set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "arm64")
set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "arm64")
# 关闭"仅活跃架构"限制
XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO
2.4
引擎库缺少 SUPPORTED_PLATFORMS
** 文件 1 **:/Applications/Cocos/Creator/3.8.x/CocosCreator.app/Contents/Resources/resources/3d/engine/native/CMakeLists.txt
第 3728-3733 行,给引擎库 cocos_engine 添加:
XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS "iphoneos iphonesimulator"
** 文件 2 **:/Applications/Cocos/Creator/3.8.x/CocosCreator.app/Contents/Resources/resources/3d/engine/native/external/sources/boost-source/container/CMakeLists.txt
第 37-42 行,给 boost_container 添加:
XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS "iphoneos iphonesimulator"
CMake 的 Xcode 生成器不会自动给静态库 target 添加 iphonesimulator 平台支持,需要手动声明。
2.5
引擎库 ONLY_ACTIVE_ARCH 导致架构不一致
** 文件 **:同上 CMakeLists.txt(引擎)第 3729 行
** 问题 **:引擎库 ONLY_ACTIVE_ARCH = YES 导致只构建 arm64,主 App 同时构建 arm64 + x86_64,链接时架构不匹配。
** 修改 **:
XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO"
2.6
启用 ios-m1-simulator 预编译库路径
** 文件 **:/Applications/Cocos/Creator/3.8.x/CocosCreator.app/Contents/Resources/resources/3d/engine/native/external/CMakeLists.txt
** 问题 **:第 21 行 ios-m1-simulator 配置被注释掉,引擎使用 ios/ 目录的真机库。
** 修改 **:
include(...ios-m1-simulator/CMakeLists.txt) # 启用
# include(...ios/CMakeLists.txt) # 注释掉
2.7
预编译库 arm64 → simulator 转换
** 工具 **:arm64-to-sim — 将 arm64 真机二进制转换为模拟器兼容格式。
** 成功转换的库 **(12个):
libcrypto.a, libfreetype.a, libjpeg.a, libpng.a, libssl.a, libtbb_static.a, libtbbmalloc_proxy_static.a, libtbbmalloc_static.a, libuv_a.a, libwebp.a, libwebsockets.a
** 转换流程 **:
# 1. 提取 arm64 切片
lipo xxx.a -thin arm64 -output arm64.a
# 2. 解压 .o 文件
ar x arm64.a
# 3. 逐个转换
arm64-to-sim png.o -o png.o
# 4. 重新打包
ar crs lib_sim.a *.o
# 5. 合并 x86_64 + 转换后 arm64
lipo -create x86_64.a arm64_sim.a -output final.a
转换后的库放入:
/Applications/.../engine/native/external/ios-m1-simulator/libs/
2.8
V8 引擎库转换失败(致命阻塞点)
** 文件 **:libv8_monolith.a (67MB)
** 现象 **:arm64-to-sim 转换后,链接时出现数百个 V8 内部符号未定义。
** 原因 **:V8 库体量庞大、内部 .o 文件交叉引用极其复杂,arm64-to-sim 逐个文件转换的模式无法保持内部依赖完整性。
** 其他同样无法处理的库 **:libv8_monolith.a、glslang/*.a(10个)、spirv-cross/*.a(3个)
三、最终结论
| 层级 | 问题数 | 状态 |
|------|--------|------|
| C++ 编译兼容 | 2 |
全部解决 |
| 模拟器架构/平台配置 | 4 |
全部解决 |
| 普通预编译库(12个) | 1 |
arm64-to-sim 成功 |
| V8 等复杂库 | 1 |
无法转换,阻塞 |
Cocos Creator 3.8.x 的 iOS 原生构建链路** 目前不支持 Apple Silicon 模拟器 **。引擎代码中预留了 ios-m1-simulator 配置路径,说明官方有计划支持,但未完成。