M1芯片Xcode编译KMM项目提示embedAndSignAppleFrameworkForXcode任务缺失
问题原因
- 核心问题是
shared模块的iOS目标架构判断逻辑存在缺陷:仅对iOS真机(SDK_NAME前缀为iphoneos)做了iosArm64适配,其余所有场景(包括M1芯片的iOS模拟器)全部默认指定为iosX64目标。 - 原生运行在M1芯片上的Xcode编译iOS模拟器时,会匹配arm64架构的KMM编译任务,而你的配置中对应场景生成的是x86_64架构的目标,不存在对应架构的
embedAndSignAppleFrameworkForXcode任务,因此编译失败。 - 切换Rosetta模式后Xcode运行在x86_64转译环境下,会匹配x86_64架构的编译任务,刚好和你配置里默认生成的iosX64目标匹配,因此可以编译成功。
- 你提供的安卓模块配置、JDK版本本身不存在问题,无需修改。
永久解决方法
方案一:修改现有动态判断逻辑(改动最小)
直接替换shared模块中原有iosTarget的判断代码,兼容M1芯片的iOS模拟器arm64架构:
val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget = when { // iOS真机场景 System.getenv("SDK_NAME")?.startsWith("iphoneos") == true -> ::iosArm64 // M1芯片的iOS模拟器场景,判断架构为arm64 System.getenv("ARCHS")?.contains("arm64") == true -> ::iosArm64 // 其余场景(Intel芯片的模拟器、Rosetta模式下的模拟器)用iosX64 else -> ::iosX64 }
方案二:使用多目标合并配置(兼容性更强,官方推荐)
直接删除原有动态判断iosTarget的代码,显式声明所有需要支持的iOS目标,Kotlin Gradle插件会自动根据Xcode传入的参数匹配对应编译任务:
kotlin { android() // 同时声明iOS真机、X64模拟器、Arm64模拟器三类目标 iosArm64("ios") iosX64() iosSimulatorArm64() // 统一配置所有iOS目标的framework参数 targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> { binaries.withType<org.jetbrains.kotlin.gradle.plugin.mpp.Framework> { baseName = "kmm_shared" } // 保留你原有的编译器参数配置 compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xexport-kdoc" compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.time.ExperimentalTime" } sourceSets { val commonMain by getting { // 你原有commonMain的配置保持不变 kotlin.srcDir("$buildDir/generated-apis/src/commonMain/kotlin") dependencies { // 原有依赖保持不变 } } val commonTest by getting { // 原有commonTest配置保持不变 } val androidMain by getting { // 原有androidMain配置保持不变 } val androidTest by getting { // 原有androidTest配置保持不变 } // 合并三类iOS目标的源码集 val iosX64Main by getting val iosArm64Main by getting val iosSimulatorArm64Main by getting val iosMain by creating { dependsOn(commonMain) iosX64Main.dependsOn(this) iosArm64Main.dependsOn(this) iosSimulatorArm64Main.dependsOn(this) // 原有iosMain的依赖配置挪到此处 dependencies { with(Deps.Ktor) { api(clientIos) } } } val iosX64Test by getting val iosArm64Test by getting val iosSimulatorArm64Test by getting val iosTest by creating { dependsOn(commonTest) iosX64Test.dependsOn(this) iosArm64Test.dependsOn(this) iosSimulatorArm64Test.dependsOn(this) } } }
后续验证步骤
- 确认你安装的Amazon Corretto 17为arm64架构版本,终端执行
java -version若返回结果包含aarch64即为正确。 - 执行
./gradlew clean清理项目缓存。 - 关闭Xcode的Rosetta运行选项,直接启动编译即可。
内容的提问来源于stack exchange,提问作者onekinn1023
相关产品推荐
相关产品推荐

