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

如何在Swift Framework中使用Obj-C Framework代码?相关报错如何解决?

在Swift Framework中引用独立Obj-C Framework的实现方案

可行性确认

完全可以在独立的Swift Framework中引用单独编译的Obj-C Framework,无需将两类代码合并到同一个Framework target中,你遇到的报错均是Obj-C模块导出配置不正确导致的。

前置校验(先修复Obj-C Framework的模块配置,这是核心根因)

你的所有报错根源都是ObjCFramework本身没有正确导出为模块化框架,先按以下步骤调整ObjCFramework的target配置:

  • 确认DEFINES_MODULE = YES
  • 确认所有需要对外暴露的头文件,都放在Build Phases > Headers > Public分组下,Private和Project分组下的头文件无法被外部模块引用
  • 检查ObjCFramework的伞头(默认命名为ObjCFramework.h),确保里面只#import所有公开头文件,不要引入内部私有头或者外部非模块化头
  • 确认CLANG_ENABLE_MODULES = YES,编译后Xcode会自动在生成的.framework的Modules目录下生成module.modulemap文件,无需手动创建

Swift Framework端配置步骤

  • 先清空所有之前手动添加的自定义modulemap文件、以及SWIFT_INCLUDE_PATHS里手动新增的modulemap路径,手动配置的路径是报错2、3的直接诱因
  • 依赖配置:
    • 确认Swift Framework的target的Build Phases > Dependencies里已添加ObjCFramework的target,保证编译顺序正确
    • 在Build Phases > Link Binary With Libraries里添加ObjCFramework.framework,Frameworks and Libraries中ObjCFramework的Embed选项按需选择:静态框架选Do Not Embed,动态框架选Embed & Sign
    • 构建设置的Framework Search Paths添加ObjCFramework.framework的输出路径,不要往Header Search Paths里加任何ObjCFramework的头路径,否则会触发非模块化头报错
    • 不要在Swift Framework的伞头里引入任何ObjCFramework的头文件,这是报错1的核心诱因
  • 代码引用:在Swift Framework需要用到Obj-C接口的Swift文件顶部直接写import ObjCFramework即可

对应报错的针对性修复

  • 报错1(Include of non-modular header inside framework module):删除Swift Framework伞头中所有ObjCFramework的#import语句,同时检查ObjCFramework的伞头中是否引入了非公开的头文件
  • 报错2(Module was built in directory...):删除SWIFT_INCLUDE_PATHS里的ObjCFramework modulemap路径,完全依赖Xcode自动生成的模块路径索引,清空DerivedData后重新编译
  • 报错3/4(No such module / underlying Objective-C module not found):先单独编译一次ObjCFramework,确认输出的.framework的Modules目录下存在自动生成的module.modulemap文件,再检查Swift Framework的Framework Search Paths路径是否正确指向ObjCFramework.framework的所在目录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:39:04