【发布时间】:2019-01-11 02:24:37
【问题描述】:
我正在尝试将 iOS .framework 链接到 Kotlin Multiplatform/Native,以便我可以在 Kotlin 中使用它。我成功地将框架链接到 Kotlin Multiplatform/Native,并且正确的包包含我链接的标头。
但是,每当我尝试构建项目时,Undefined symbols for architecture 就会发生。
我尝试在 iosX64 预设和 iPhone iosArm64 预设上为 iPhone 模拟器编译到不同的架构。
我尝试将 .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
【问题讨论】:
-
能否给我们提供有关为框架创建 *.def 文件的文档的链接?你是用手还是用工具做的?
-
您好,我是通过反复试验和错误手工完成的。不幸的是,除了github.com/JetBrains/kotlin-native/blob/master/INTEROP.md 和kotlinlang.org/docs/reference/native/c_interop.html 之外没有太多的文档
标签: ios kotlin interop kotlin-native kotlin-multiplatform