簡體   English   中英

Xcode 中使用的 KMM xcframework 需要 Rosetta:“為 iOS Simulator-arm64 構建,但嘗試與為 iOS Simulator-x86_6 構建的文件鏈接”

[英]KMM xcframework used in Xcode needs Rosetta: "building for iOS Simulator-arm64 but attempting to link with file built for iOS Simulator-x86_64"

我通過 Android KMM 項目創建了一個 xcframework

#!/bin/bash

./gradlew :shared:packForXCodeArm -PXCODE_CONFIGURATION=Release
./gradlew :shared:packForXCodeX64 -PXCODE_CONFIGURATION=Release
FRAMEWORK_NAME="shared"
ARM64PATH="shared/build/xcode-framework-arm/${FRAMEWORK_NAME}.framework"
X64PATH="shared/build/xcode-framework-X64/${FRAMEWORK_NAME}.framework"
UNIVERSAL_PATH="shared/build/xcode-framework-universal/"

xcodebuild -create-xcframework -framework "${ARM64PATH}" -framework "${X64PATH}" -output "${UNIVERSAL_PATH}/${FRAMEWORK_NAME}.xcframework"

我的build.gradle.kts包含:

val packForXcodeArm by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val framework = kotlin.targets.getByName<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget>("iosArm64").binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-framework-arm")
    from({ framework.outputDirectory })
    into(targetDir)
}

val packForXcodeX64 by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val framework = kotlin.targets.getByName<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget>("iosX64").binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-framework-X64")
    from({ framework.outputDirectory })
    into(targetDir)
}

在不使用 Rosetta 時,在我的 M1 上的 Xcode 中,我得到

ld: warning: ignoring file /Users/.../Library/Developer/Xcode/DerivedData/froeling_ios-dwqfcfqkcvofjtgtuipjhkedehfx/Build/Products/Debug-iphonesimulator/shared.framework/shared, building for iOS Simulator-arm64 but attempting to link with file built for iOS Simulator-x86_64
Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_SharedNetworkRequests", referenced from:
      objc-class-ref in LoginView.o

有沒有辦法在 Xcode 中創建一個在沒有 Rosetta 的情況下也可以工作的 xcframework?

該錯誤是正常的,因為您缺少為iosSimulatorArm64構建的符號。

我沒有使用 KMM,但我檢查了。 從 1.5.30 版本開始,Kotlin 支持 4 個新目標:

  1. macosArm64
  2. iosSimulatorArm64
  3. watchos模擬器Arm64
  4. tvosSimulatorArm64

在此處查看其發行說明: Kotlin 1.5.30

因此,要消除該錯誤,請針對 iosSimulatorArm64 構建並將構建結果與其他平台連接,以獲得“真正的”通用 xcframwork。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM