Kotlin Multiplatform iOS集成问题:对应架构的shared.framework链接异常
解决KMP iOS架构Framework匹配问题的可行方案
方案1:拆分KMP Framework输出目录,配置Xcode条件搜索路径
先修改KMP的输出配置,让模拟器和真机的Framework分开存放,再给Xcode设置对应架构的条件搜索路径:
- 在KMP项目的
build.gradle.kts(Groovy项目用build.gradle)中,为每个iOS目标指定独立的输出目录:
iosSimulatorArm64 { binaries.framework { baseName = "shared" outputDirectory.set(file("build/bin/iosSimulator/debug")) } } iosArm64 { binaries.framework { baseName = "shared" outputDirectory.set(file("build/bin/iosDevice/debug")) } }
- 配置Xcode的条件搜索路径:
- 打开iOS项目的Build Settings,找到
Framework Search Paths - 删除原有的递归搜索路径,点击
+添加新路径 - 点击路径右侧箭头,选择
Add Conditional Setting,分别为Any iOS Simulator SDK和Any iOS SDK设置对应的KMP输出目录(比如模拟器填../你的KMP项目名/build/bin/iosSimulator/debug,真机填../你的KMP项目名/build/bin/iosDevice/debug)
这样Xcode编译不同目标时,会自动匹配对应架构的Framework路径。
- 打开iOS项目的Build Settings,找到
方案2:用Xcode Run Script自动切换Framework路径
如果不想改动KMP输出路径,可以添加编译前脚本自动替换正确的Framework路径:
- 在iOS项目的Target里,新增一个Run Script Phase,并将其拖动到
Link Binary With Libraries步骤之前 - 脚本内容如下(记得替换
KMP_FRAMEWORK_ROOT为你的KMP项目实际路径):
# 获取当前编译的SDK类型 SDK_TYPE=$SDK_NAME # 定义KMP Framework的基础路径 KMP_FRAMEWORK_ROOT="../你的KMP项目名/build/bin" # 根据SDK选择对应架构的Framework路径 if [[ "$SDK_TYPE" == *simulator* ]]; then TARGET_FRAMEWORK="$KMP_FRAMEWORK_ROOT/iosSimulator/debug/shared.framework" else TARGET_FRAMEWORK="$KMP_FRAMEWORK_ROOT/iosDevice/debug/shared.framework" fi # 更新Xcode的框架搜索路径 /usr/libexec/PlistBuddy -c "Set :FRAMEWORK_SEARCH_PATHS:0 $TARGET_FRAMEWORK" "$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH"
每次编译时,脚本会自动识别当前是模拟器还是真机环境,切换到正确的Framework路径。
方案3:用CocoaPods管理KMP Framework(最省心)
借助CocoaPods自动处理架构匹配问题,无需手动配置路径:
- 在KMP项目的
build.gradle.kts中启用CocoaPods插件:
plugins { kotlin("multiplatform") id("com.android.library") id("org.jetbrains.kotlin.native.cocoapods") } cocoapods { summary = "你的KMP共享框架描述" ios.deploymentTarget = "14.0" framework { baseName = "shared" } // 指定iOS项目的Podfile路径 podfile = project.file("../你的iOS项目名/Podfile") }
- 在iOS项目的Podfile中添加依赖:
pod 'shared', :path => '../你的KMP项目名'
- 执行
pod install,后续Xcode编译时,CocoaPods会自动根据当前编译目标(模拟器/真机)拉取对应架构的Framework,完全无需手动干预路径。
内容的提问来源于stack exchange,提问作者Suraj Mirajkar
相关产品推荐
相关产品推荐

