Xcode 14.1模拟器排除arm64致iOS14+ SPM链接错误求解决方案
问题分析与解决方案
为什么仅iOS14+版本出现链接错误?
核心原因是Apple Silicon Mac模拟器的架构支持差异:
- iOS13及以下的模拟器不支持arm64架构,即使项目排除arm64,Xcode也只会编译x86_64版本代码,Kingfisher等SPM依赖会自动匹配生成对应架构的二进制,因此链接正常。
- iOS14及以上的模拟器原生支持arm64架构,当项目全局排除arm64后,Xcode会强制以x86_64架构构建。但Xcode 14.1的SPM在处理iOS14+模拟器目标时,默认会同时生成arm64和x86_64的依赖二进制,此时链接器尝试寻找x86_64版本的Kingfisher符号,却因SPM构建逻辑的适配问题,导致该版本符号未被正确生成或引用,最终触发链接错误。
如何避免链接错误?
方案1:仅针对旧版库单独排除arm64
不要在项目全局设置EXCLUDED_ARCHS,只给那些无法提供arm64模拟器架构的旧版xcframework对应的target设置:
- 打开Xcode,选中旧版库的target(而非主项目target)
- 进入
Build Settings,搜索Excluded Architectures - 添加条件
sdk=iphonesimulator*,对应值设为arm64
既解决旧库的兼容问题,又不影响SPM依赖的正常架构匹配。
方案2:给架构排除规则添加版本条件
如果必须全局设置排除,可通过条件限制仅针对iOS13及以下模拟器生效:
- 选中主项目target的
Build Settings - 找到
Excluded Architectures,点击+号添加复合条件:sdk=iphonesimulator*且os=ios <14.0 - 将该条件对应的值设为
arm64
这样iOS14+模拟器不会排除arm64,能正常链接SPM依赖的arm64版本符号。
方案3:强制SPM依赖编译x86_64版本(调试阶段用)
在项目的Package.swift中,为Kingfisher等依赖指定编译架构:
dependencies: [ .package(url: "https://github.com/onevcat/Kingfisher.git", from: "7.0.0") ], targets: [ .target( name: "YourTarget", dependencies: ["Kingfisher"], swiftSettings: [ .unsafeFlags(["-arch", "x86_64"], .when(platforms: [.iOS], configuration: .debug)) ] ) ]
注意:该方法仅建议在调试阶段使用,发布版本建议保持默认架构设置。
内容的提问来源于stack exchange,提问作者iosdevmk
相关产品推荐
相关产品推荐

