Rust编译iOS/Catalyst库构建XCFramework接入CocoaPods报动静库混合错误
错误原因
你遇到的错误是CocoaPods对XCFramework的强制校验规则导致的:
Unable to install vendored xcframework
FooFrameworkfor PodBarProject, because it contains both static and dynamic frameworks.
CocoaPods要求XCFramework内所有平台的框架切片必须是完全相同的链接类型(全静态或者全动态),只要存在一个切片是静态、另一个是动态就会抛出该错误。你将iOS和Catalyst拆分打包后正常,就是因为两个独立XCFramework内部的切片类型各自统一。
修复方案
1. 统一Xcode项目的Mach-O类型配置
你拆分的两个Xcode项目(FooFramework_iOS、FooFramework_Mac)的Mach-O类型配置不一致,才导致生成的切片类型不同:
- 分别打开两个Xcode项目,进入对应target的
Build Settings页面 - 搜索
Mach-O Type配置项,两个项目统一设置为Static Library(你底层依赖的Rust编译产物是静态库,全静态配置可以避免运行时符号丢失、冲突问题) - 保持
BUILD_LIBRARY_FOR_DISTRIBUTION=YES的配置不变
2. 预校验所有切片类型
生成三个XCArchive之后、合并XCFramework之前,执行命令校验每个framework的类型,确认全部统一:
# 校验iOS真机切片类型 file ./FooFramework-iOS.xcarchive/Products/Library/Frameworks/FooFramework_iOS.framework/FooFramework_iOS # 校验iOS模拟器切片类型 file ./FooFramework-Sim.xcarchive/Products/Library/Frameworks/FooFramework_iOS.framework/FooFramework_iOS # 校验Mac Catalyst切片类型 file ./FooFramework-macOS.xcarchive/Products/Library/Frameworks/FooFramework_Mac.framework/FooFramework_Mac
输出结果包含current ar archive即为静态库,所有输出一致后再执行合并XCFramework的命令即可。
3. Podspec补充声明
在你的Podspec中明确声明静态框架属性,避免CocoaPods自动识别出错:
s.static_framework = true s.vendored_frameworks = 'FooFramework.xcframework'
内容的提问来源于stack exchange,提问作者arik
相关产品推荐
相关产品推荐

