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

KMP导入Swift框架至Kotlin时Gradle同步CInterop报错

KMP导入Swift框架CInterop任务报Android依赖变体匹配失败解决方案

核心问题原因

  • 该报错和你的SingletonFramework配置、.def文件、CInterop搜索路径配置无直接关系,本质是依赖作用域配置错误
  • 报错中提到的com.google.android.material:material:1.6.1、androidx.appcompat:appcompat:1.4.2、androidx.constraintlayout:constraintlayout:2.1.4均为Android平台专属AAR依赖,不存在适配iOS native目标的cinterop-klib格式变体
  • 上述Android专属依赖被错误声明在了shared模块的顶层依赖、commonMain依赖或者全源集通用依赖块中,没有限定仅Android目标加载,导致iOS侧执行CInterop任务解析依赖时,会尝试为iOS模拟器架构匹配这些Android依赖的适配版本,最终触发变体匹配失败报错。

修复步骤

  1. 调整依赖作用域,将所有Android专属依赖全部挪到Android目标的专属依赖块中,禁止在公共/通用依赖块中声明Android-only依赖:
// 错误示例:不要在全局、common源集下声明Android专属AAR依赖
// dependencies {
//     implementation("com.google.android.material:material:1.6.1")
//     implementation("androidx.appcompat:appcompat:1.4.2")
//     implementation("androidx.constraintlayout:constraintlayout:2.1.4")
// }

// 正确示例:Android专属依赖仅在androidTarget下声明
androidTarget {
    compilations.getByName("main") {
        dependencies {
            implementation("com.google.android.material:material:1.6.1")
            implementation("androidx.appcompat:appcompat:1.4.2")
            implementation("androidx.constraintlayout:constraintlayout:2.1.4")
            // 其余所有仅Android端使用的AAR/JAR依赖全部放在此处
        }
    }
}
  1. 如果需要在公共逻辑层调用上述依赖的能力,通过KMP的expect/actual机制抽象接口,在androidMain源集下写具体实现,不要直接在commonMain中引用Android专属依赖。
  2. 修正依赖配置后重新执行Gradle同步,若仍存在CInterop相关报错,再补充检查两项配置:
    • 确认Swift框架SingletonFramework的Build Settings中Build Libraries for Distribution选项设为YES,所有需要暴露给Kotlin侧的Swift类、方法、属性均加public修饰和@objc注解,确保编译时会生成Objective-C兼容头文件
    • 你当前配置中硬编码的Xcode DerivedData绝对路径在清理DerivedData、切换设备、换团队成员运行时会失效,建议后续改为通过Xcode环境变量动态获取框架搜索路径,避免硬编码问题。

配置优化参考

你当前为iosX64、iosSimulatorArm64两个目标写了完全重复的CInterop配置,可以抽成公共逻辑减少冗余代码:

// 抽离公共的模拟器框架路径配置,可后续替换为动态获取逻辑
val simulatorFrameworkPath = "/Users/skwaj/Library/Developer/Xcode/DerivedData/iosApp-dhubylxzcqsleeamrwqbmhcxrxzj/Build/Products/Debug-iphonesimulator/"

// 批量配置iOS模拟器目标
listOf(iosX64(), iosSimulatorArm64()).forEach { iosTarget ->
    iosTarget.compilations.getByName("main") {
        val DateTools by cinterops.creating {
            defFile("src/iosMain/iOSWrapperFramework.def")
            compilerOpts(
                "-framework", "SingletonFramework",
                "-F$simulatorFrameworkPath"
            )
        }
    }
    iosTarget.binaries.all {
        linkerOpts(
            "-framework", "SingletonFramework",
            "-F$simulatorFrameworkPath"
        )
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:57:11