我正在尝试将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
答案 0 :(得分:1)
找到答案:
从1.1.1
中的linkerOpts
compilerOpts
和build.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