单项目同时使用Swift Package Manager与CocoaPods的iOS模拟器编译异常问题
解决M1设备上SPM+CocoaPods混合时模拟器编译找不到模块的问题
我之前在M1 Mac上折腾SPM和CocoaPods共存的时候,也碰到过几乎一模一样的模拟器编译报错问题,给你几个亲测有效的解决思路:
1. 给SPM Package添加模拟器架构排除配置
既然你的CocoaPods依赖靠排除arm64解决了类似问题,那把同样的逻辑应用到你的SPM Package上试试。打开你的Package.swift,在target的buildSettings里添加针对模拟器的架构排除:
let package = Package( name: "CoreKit", platforms: [.iOS(.v14)], // 替换成你的项目最低支持版本 products: [ .library(name: "CoreKit", targets: ["CoreKit"]), ], targets: [ .target( name: "CoreKit", buildSettings: [ "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "arm64" ] ), // 测试target如果也有问题,同样加上这个配置 .testTarget( name: "CoreKitTests", dependencies: ["CoreKit"], buildSettings: [ "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "arm64" ] ), ] )
2. 统一项目和Target的架构排除设置
有时候项目级别的配置会覆盖Target的设置,你可以这么操作:
- 打开Xcode,选中你的项目文件(不是单个Target)
- 切换到
Build Settings标签,搜索Excluded Architectures - 点击
+号,添加Any iOS Simulator SDK,然后设置值为arm64 - 确保所有Target的
Excluded Architectures设置是$(inherited),这样会继承项目的配置
3. 彻底清理缓存并重置环境
M1设备上的编译缓存经常会搞出奇怪的问题,试试这套组合拳:
- 删除Derived Data:Xcode顶部菜单选择
Xcode > Preferences > Locations,点击Derived Data旁边的箭头打开文件夹,删除里面的所有内容 - 执行命令重新安装Pods:
pod deintegrate pod install - 重启Xcode和iOS模拟器,然后Clean Build Folder(快捷键
Cmd+Shift+K)再重新编译
4. 检查CoreKit的依赖兼容性
如果上面的方法都没用,那得确认你的CoreKit Package有没有依赖只支持真机架构的第三方库。有些老的闭源库可能没有提供x86_64和arm64的模拟器架构,这种情况下你需要替换依赖,或者联系库作者更新架构支持。
另外注意:不要同时移除Podfile里的arm64排除配置,因为你的CocoaPods依赖大概率还是需要这个设置的,应该让Podfile的配置和SPM的配置同时生效,这样两边的依赖都能兼容M1模拟器的架构。
内容的提问来源于stack exchange,提问作者Robert Clegg
相关产品推荐
相关产品推荐

