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

通过CocoaPods在多个iOS模块中导入KMM库导致“…同时在两个…中实现”错误

解决KMM Framework在iOS多模块中的重复符号冲突问题

我之前在拆分iOS多模块项目时也碰到过一模一样的KMM依赖冲突问题,给你几个经过验证的可行方案:

1. 将KMM库改为静态Framework(最推荐)

动态Framework被多个子模块同时嵌入时,确实会出现你遇到的重复类实现问题——每个模块都会把KMM的代码打包进去,运行时系统就不知道该用哪一份了。而静态Framework只会在最终的App包中被链接一次,从根源上解决冲突。

你只需要在KMM项目的build.gradle.kts中修改iOS目标的配置:

ios {
    binaries {
        framework {
            baseName = "YourKMMFrameworkName"
            isStatic = true // 核心配置:切换为静态库
        }
    }
}

注意:如果你的KMM库依赖了第三方库(比如Ktor、Coroutines),需要确保这些依赖也使用静态版本。可以在iOS项目的Podfile中添加全局静态链接配置:

use_frameworks! :linkage => :static

2. 统一KMM库的嵌入入口

如果坚持用动态Framework,那必须保证只有主App负责嵌入KMM库,所有子模块只做链接不嵌入:

  • 在主App的Build Phases -> Embed Frameworks中,将KMM Framework设置为Embed & Sign
  • 在所有子模块(Common、Core)的Build Phases中:
    • 把KMM Framework添加到Link Binary With Libraries
    • 绝对不要在Embed Frameworks中添加它,或者设置为Do Not Embed
  • 同时确保所有模块引用的是同一个KMM Framework文件,避免各自复制一份到DerivedData中

3. 用CocoaPods统一管理KMM依赖

为你的KMM库创建一个自定义podspec,让CocoaPods帮你处理依赖去重:

Pod::Spec.new do |s|
    s.name = "YourKMMFramework"
    s.version = "1.0.0"
    s.source = { :path => "../your-kmm-project/build/bin/ios/release" }
    s.vendored_frameworks = "YourKMMFramework.xcframework"
    s.static_framework = true # 如果用静态库的话
end

然后在主App和所有子模块的Podfile中引用这个pod:

pod 'YourKMMFramework', :path => '../path/to/your-podspec'

CocoaPods会自动识别重复依赖,确保整个项目中只链接一次KMM库。

4. 检查XCFramework的配置细节

如果你尝试过XCFramework但没解决问题,大概率是嵌入方式不对:

  • 确保所有模块使用的是同一个XCFramework文件,不要每个模块单独导入一份
  • 子模块只做链接,不嵌入;只有主App负责嵌入和签名
  • 清理DerivedData后重新构建,避免缓存的旧Framework导致冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:32:48