链接iOS框架时,无法在Kotlin Multiplatform中运行“ linkDebugFrameworkIos”

时间:2019-01-11 02:24:37

标签: ios kotlin interop kotlin-native kotlin-multiplatform

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

然而,每当我尝试构建项目时,Undefined symbols for architecture就会发生。

我尝试针对iosX64预设和iPhone iosArm64预设编译为不同的体系结构。

然后我尝试将.framework本身添加到普通的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

1 个答案:

答案 0 :(得分:1)

找到答案:

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