【问题标题】:Fail to run "linkDebugFrameworkIos" in Kotlin Multiplatform when linking iOS Framework链接 iOS 框架时无法在 Kotlin Multiplatform 中运行“linkDebugFrameworkIos”
【发布时间】: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

【问题讨论】:

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


【解决方案1】:

找到答案:

从 Kotlin Multiplatform 1.1.1 linkerOptscompilerOptsbuild.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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-05-27
  • 2021-05-12
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2019-12-31
相关资源
最近更新 更多