You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Framework开启BUILD_LIBRARY_FOR_DISTRIBUTION后协议见证表符号丢失问题

解决思路

根因

开启BUILD_LIBRARY_FOR_DISTRIBUTION后,Swift编译器会启用库演化功能,对跨模块不可见的符号做激进裁剪,第三方依赖和你自己的Framework编译选项不匹配、协议见证表(PWT)没有显式标记为可导出,都会导致遵守外部协议的类的PWT符号被剥离。

可落地解决方案

  • 统一所有依赖库的编译选项
    你依赖的RxFlow、RxSwift等所有第三方库,必须和你的Framework一样开启BUILD_LIBRARY_FOR_DISTRIBUTION=YES,否则跨模块的协议遵守关联的PWT符号不会被导出。如果使用CocoaPods管理依赖,可以在Podfile中添加如下post_install钩子统一配置:
    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          # 统一开启分发编译选项
          config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
          # 保持部署目标和主工程一致
          config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
        end
      end
    end
    
  • 显式导出缺失的PWT符号
    先通过Debug模式(不开分发编译选项)编译的Framework,执行如下命令拿到缺失的PWT完整符号名:
    nm -gU <Framework路径/MoviesModuleDisplay> | grep "protocol witness table"
    
    然后在你的Framework工程的Build Settings - Other Linker Flags中添加显式导出配置,示例如下:
    -Wl,-exported_symbol,__ZTW23MoviesModuleDisplay11RemoteModelC6RxFlow7StepperAAMc
    -Wl,-exported_symbol,__ZTW23MoviesModuleDisplay11DisplayFlowC6RxFlow4FlowAAMc
    
    注意替换为你实际查找到的符号名称。
  • 统一Swift语言版本
    确保你的Framework、所有依赖库、宿主App使用的Swift大版本完全一致,库演化功能对Swift版本兼容性有严格要求,版本不一致会导致PWT符号命名规则不匹配,看起来被剥离。
  • 编译为XCFramework
    不要使用单架构的Framework,分别编译iOS真机和模拟器的archive产物后,用xcodebuild -create-xcframework命令合并为XCFramework使用,避免架构切片带来的符号丢失问题。

内容的提问来源于stack exchange,提问作者Carles Estevadeordal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:45:04