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

无法在iOS静态库中访问共享KMM代码的问题排查求助

KMM代码封装为iOS静态库后无法被其他Xcode项目访问的问题解决

问题原因

常规Swift静态库的创建流程并不完全适配KMM项目,核心遗漏点包括:

  1. 未处理KMM的框架依赖:KMM共享代码编译后依赖Kotlin标准库等原生框架,直接复制源文件到静态库会丢失这些依赖,导致符号无法解析。
  2. 缺少桥接文件与模块映射配置:KMM通过Obj-C/Swift桥接暴露Kotlin代码,静态库未正确配置桥接头和模块映射,目标项目无法识别KMM的命名空间与符号。
  3. 符号导出不完整:默认静态库的符号隐藏设置会剥离KMM生成的符号,即使标记文件为Public也无法让外部访问。

解决方案

1. 正确引入KMM编译产物到静态库

不要直接复制KMM的源文件到静态库,而是使用KMM项目生成的iOS框架:

  • 在KMM项目中执行./gradlew iosFramework,生成编译后的.framework文件(路径通常为build/ios/x86_64/debug或arm64/debug)。
  • 在静态库的Xcode项目中,将该.framework添加到Linked Frameworks and Libraries,并设置Embed选项为Embed & Sign(根据你的签名配置调整)。

2. 配置桥接文件与模块映射

  • 桥接文件设置:在静态库的Build Settings中,找到Objective-C Bridging Header,指向KMM生成的桥接头文件(比如SharedCode-Bridging-Header.h,可在KMM项目的iosMain目录或build产物中找到)。
  • 模块映射配置:创建module.modulemap文件,内容如下:
module SharedCode {
    header "SharedCode-Bridging-Header.h"
    export *
}

将该文件添加到静态库项目中,并在Build Settings的Module Map File中指定其路径。

3. 调整静态库的符号导出设置

  • 在静态库的Build Settings中,设置Dead Code Stripping为NO,避免KMM符号被误剥离。
  • 设置Symbols Hidden by Default为NO,确保所有KMM生成的符号都能被外部访问。

4. 正确集成静态库到目标项目

  • 将静态库的.a文件、桥接头、模块映射文件以及KMM的.framework文件一起导入目标项目。
  • 在目标项目的Build Settings中:
    • 添加静态库头文件目录到Header Search Paths(设置为$(PROJECT_DIR)/[静态库头文件路径])。
    • 添加静态库.a文件目录到Library Search Paths。
    • 确保KMM的.framework也被添加到目标项目的Linked Frameworks and Libraries中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:01:24