Не удается запустить "linkDebugFrameworkIos" в Kotlin Multiplatform при связывании iOS Framework - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь связать .framework iOS с Kotlin Multiplatform / Native, чтобы я мог использовать его в Kotlin. Я успешно связываю Framework с Kotlin Multiplatform / Native, и соответствующие пакеты содержат заголовки, которые я связал.

Однако Undefined symbols for architecture происходит всякий раз, когда я пытаюсь построить проект.

Я попытался скомпилировать для другой архитектуры iPhone Simulator с предустановкой iosX64 и для предустановки iPhone iosArm64.

И я попытался добавить сам .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

1 Ответ

0 голосов
/ 15 января 2019

Нашел ответ:

Начиная с Kotlin Multiplatform 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
...