Xcode 15.2下Kotlin多平台项目链接命令失败(退出码1)求助
Xcode 15.2 下 KMM Swift Package 链接错误(未定义符号+架构不匹配)解决方案
问题核心
从错误日志能看出两个直接关联的问题:
- 架构不匹配:模拟器构建时加载的是x86_64架构的
movies.framework,但Xcode 15.2的arm64模拟器要求对应架构的二进制文件 - 未定义符号:本质是framework中缺失需要的类符号,由架构不匹配直接导致
解决方案
1. 修正KMM框架的架构输出配置
修改build.gradle.kts中的iOS二进制配置,确保覆盖所有需要的架构,并正确生成framework:
listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "movies" // 保持regular framework的动态特性(如果是静态框架则设为true) isStatic = false } }
同时更新multiplatformSwiftPackage配置,明确指定支持的架构:
multiplatformSwiftPackage { swiftToolsVersion("5.3") targetPlatforms { iOS { v("13") } } // 新增:明确声明支持的架构 supportedArchitectures { iosSimulatorArm64() iosX64() iosArm64() } }
2. 调整Xcode 15.2的项目架构设置
打开iOS项目的Build Settings:
Architectures:设置为Standard Architectures (arm64, x86_64)Excluded Architectures:Debug模式下取消排除arm64(Xcode 15.2默认可能对模拟器排除该架构)Build Active Architecture Only:Debug设为YES,Release设为NO
3. 重新生成并发布Swift Package
执行以下命令清理并重新生成Swift Package:
./gradlew clean swiftPackage
上传新生成的Package到GitHub时,确保完整上传所有架构的framework产物,避免遗漏arm64模拟器版本。
4. 验证iOS项目的依赖引入
检查Package.swift中依赖配置是否正确,确保引用最新版本的Swift Package:
dependencies: [ .package(url: "你的GitHub仓库地址", from: "0.0.1") ], targets: [ .target( name: "你的iOS项目Target名称", dependencies: [.product(name: "movies", package: "你的Swift Package名称")] ) ]
在Xcode中执行File > Packages > Update to Latest Package Versions同步依赖。
5. 额外排查点
- 确认KMM中暴露给iOS的类添加了
@ObjC注解或继承NSObject,确保能被Swift识别:@ObjC class GetMoviesUseCase : NSObject { // 类实现 } - 用
nm命令检查framework是否包含目标符号:
若无输出,说明类未被编译进framework,需检查KMM代码的可见性或编译配置。nm -gU /path/to/movies.framework/movies | grep MoviesGetMoviesUseCase
内容的提问来源于stack exchange,提问作者Akhil Balakrishnan
相关产品推荐
相关产品推荐

