2

我正在尝试将 iOS .framework 链接到 Kotlin Multiplatform/Native,以便我可以在 Kotlin 中使用它。我成功地将框架链接到 Kotlin Multiplatform/Native,并且正确的包包含我链接的标头。

但是Undefined symbols for architecture,每当我尝试构建项目时都会发生。

iosX64我已经尝试在预设和 iPhone预设上为 iPhone 模拟器编译到不同的架构iosArm64

我尝试将 .framework 本身添加到 vanilla XCode 项目中,它在模拟器和 iPhone 上运行良好。

这是.def文件

// engine.def
language = Objective-C

package = org.djinnihello
headers = DjinniHelloLib2.h
headerFilter = **

这是build.gradle文件的一部分

//build.gradle
targets {
    fromPreset(presets.android, 'android')
    // This preset is for iPhone emulator
    // Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
    fromPreset(presets.iosArm64, 'ios') {
        compilations.main {
            outputKinds('FRAMEWORK')
            cinterops {
                def productsDir = rootProject.file("iosApp/iosApp/Framework").absolutePath
                println(productsDir)
                hello {
                    defFile project.file("src/engine.def")
                    compilerOpts "-F${productsDir} -framework DjinniHelloLib2"
                    linkerOpts "-F${productsDir} -framework DjinniHelloLib2"
                    includeDirs "$productsDir/DjinniHelloLib2.framework/Headers"
                }
            }
        }
    }
}

这是我尝试在 XCode 中构建或运行时弹出的错误消息./gradlew linkDebugFrameworkIos

> Task :app:cinteropHelloIos UP-TO-DATE

> Task :app:linkDebugFrameworkIos FAILED
Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_HWHelloWorld", referenced from:
     objc-class-ref in combined.o
       ld: symbol(s) not found for architecture arm64
4

1 回答 1

3

找到了答案:

从 Kotlin Multiplatform开始1.1.1 linkerOpts,什么也不做。它们必须在文件中才能编译和运行。compilerOptsbuild.gradle.def

language = Objective-C

package = org.djinnihello
headers = DjinniHelloLib2.h
headerFilter = **

compilerOpts = -F/absolute/path/to/Framework -framework DjinniHelloLib2
linkerOpts = -F/absolute/path/to/Framework -framework DjinniHelloLib2
于 2019-01-15T06:38:45.177 回答