Kotlin Multiplatform包在Swift Package Manager中无法识别的问题
KMP包接入SPM项目指定iOS模拟器构建时找不到模块的问题
问题场景
将Kotlin Multiplatform(KMP)包接入Swift Package Manager(SPM)管理的项目时,直接执行swift build能正常构建,但指定iOS模拟器目标构建时,出现no such module 'spm'错误;但相同包接入常规Xcode项目(iOS 16.4模拟器目标)可正常运行。
核心原因
- KMP包的架构产物缺失:你的KMP包可能未生成
arm64-apple-ios16.4-simulator架构的产物,仅默认构建了macOS或其他通用架构。Xcode会自动触发KMP的跨平台构建流程,生成对应模拟器架构的产物;但手动通过-Xswiftc传递参数时,SPM无法识别目标平台,只会查找默认架构的产物,导致找不到模块。 - SPM构建参数传递方式错误:直接用
-Xswiftc传递SDK和target参数,属于底层编译参数传递,没有让SPM感知到当前是iOS模拟器构建目标,因此不会去拉取/构建KMP包对应的iOS平台产物。
解决方案
方案1:修复KMP项目的多平台构建配置
修改KMP项目的build.gradle.kts,确保包含iOS模拟器arm64目标,并配置SPM插件正确导出多平台产物:
kotlin { // 添加iOS模拟器arm64目标 iosSimulatorArm64 { binaries.framework { baseName = "spm" isStatic = true // 静态框架更适配SPM } } iosX64() // 兼容旧版Intel模拟器 swiftPackage { platforms { ios("16.4") // 指定最低iOS版本 } product { name = "spm" targets = ["iosSimulatorArm64", "iosX64"] // 导出需要的目标架构 } } }
重新构建并发布KMP包(或本地构建后用于测试)。
方案2:使用SPM官方的--destination参数指定目标平台
放弃手动传递-Xswiftc参数,改用SPM提供的--destination来指定iOS模拟器目标,让SPM自动处理平台适配:
# 具体模拟器设备版本 swift build --destination 'platform=iOS Simulator,name=iPhone 14 Pro,OS=16.4' # 通用模拟器目标 swift build --destination "generic/platform=iOS Simulator"
这种方式会让SPM正确识别构建平台,自动拉取对应架构的KMP包产物,解决模块找不到的问题。
方案3:本地开发时直接引用KMP本地构建产物
如果是本地调试,无需发布包,可在SPM项目的Package.swift中直接指向KMP项目的本地路径:
let package = Package( name: "TestSPM", dependencies: [ .package(path: "../kmp-spm-example") // 替换为你的KMP项目本地路径 ], targets: [ .target( name: "TestSPM", dependencies: [.product(name: "spm", package: "kmp-spm-example")] ) ] )
然后执行swift build --destination "generic/platform=iOS Simulator",SPM会自动构建KMP包的iOS模拟器目标并完成链接。
内容的提问来源于stack exchange,提问作者Arsenius
相关产品推荐
相关产品推荐

