链接 iOS 框架时,在 Kotlin Multiplatform 中无法 运行 "linkDebugFrameworkIos"
Fail to run "linkDebugFrameworkIos" in Kotlin Multiplatform when linking iOS Framework
我正在尝试 link 一个 iOS .framework 到 Kotlin Multiplatform/Native 以便我可以在 Kotlin 中使用它。我成功地 link 将框架 Multiplatform/Native 成功地 Multiplatform/Native 并且正确的包包含我 link 编辑的 headers 。
但是 Undefined symbols for architecture
每当我尝试构建项目时都会发生。
我已经尝试为 iPhone 模拟器在 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
找到答案:
从 Kotlin Multiplatform 开始,1.1.1
linkerOpts
和 build.gradle
中的 compilerOpts
什么也不做。它们必须在 .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
我正在尝试 link 一个 iOS .framework 到 Kotlin Multiplatform/Native 以便我可以在 Kotlin 中使用它。我成功地 link 将框架 Multiplatform/Native 成功地 Multiplatform/Native 并且正确的包包含我 link 编辑的 headers 。
但是 Undefined symbols for architecture
每当我尝试构建项目时都会发生。
我已经尝试为 iPhone 模拟器在 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
找到答案:
从 Kotlin Multiplatform 开始,1.1.1
linkerOpts
和 build.gradle
中的 compilerOpts
什么也不做。它们必须在 .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