无法在 iOS 中构建 KMM 应用的发布版本

Cannot build release version of KMM app in iOS

我正尝试在 iOS 上为我的 KMM 应用构建发布版本。进度失败并显示消息
Exception in thread "main" java.lang.IllegalStateException: Could not find 'libCryptoKitWrapper.a' binary in neither of [CryptoKitWrapper/build/Release-iphoneos]
异常跟踪到我正在使用的 Swift 库。为了让它在 kotlin 上工作,我正在使用这个 method。令人惊讶的是,有问题的文件可以在列出的目录中找到。这可能是什么问题?相关的 cinterop 任务:

iosTarget("ios") {
    val platform = when (preset?.name) {
        "iosX64" -> "iphonesimulator"
        "iosArm64" -> "iphoneos"
        else -> error("Unsupported target $name")
    }
    compilations.getByName("main") {
        cinterops.create("CryptoKitWrapper") {
            val interopTask = tasks[interopProcessingTaskName]
            interopTask.dependsOn(":CryptoKitWrapper:build${platform.capitalize()}")
            includeDirs.headerFilterOnly("$rootDir/CryptoKitWrapper/build/Release-$platform/include")
        }
    }
}

问题是由于 Gradle 将使用 libraryPaths 设置的位置解释为相对路径,从当前 OS 目录派生。要观察这一点,请尝试从 SwiftLibSample 目录执行 ./gradlew :shared:cinteropCryptoKitWrapperIos --info,并从 SwiftLibSample/shared 执行 ../gradlew cinteropCryptoKitWrapperIos --info。第一个应该可以正常工作。

要解决此问题,可以执行以下操作。不要硬编码 .def 文件的路径,而是在 cinterops{...} 块内设置此参数。我尝试了这个,灵感来自@SalomonBRYS 在 https://github.com/JetBrains/kotlin-native/issues/2314

的回答
cinterops.create("CryptoKitWrapper") {
                ...
                extraOpts("-libraryPath", "$rootDir/CryptoKitWrapper/build/Release-$platform")
                ...

如果您想收到有关此问题的更新,请在官方 Kotlin 问题跟踪器上关注此问题 KT-48082

编辑:以下与原始问题没有直接关系,我只是想从下面的评论部分总结我的技巧。

要像 https://github.com/MJegorovas/SwiftLibSample 那样启用项目布局中使用的位码,应该:

  1. 让静态库包含Bitcode。在这种情况下,"BITCODE_GENERATION_MODE=bitcode" 选项应该跨越 xcodebuild 个参数。

  2. 使 cinterop 工具 link 成为带有 bitcode 的库。添加 -lto-embed-bitcode linker 选项到 .def 文件。