Spec-Zone.ru › Kotlin 1.7

Библиотеки Kotlin/Native

Особенности компилятора Kotlin

Для создания библиотеки с помощью компилятора Kotlin/Native используйте флаг -produce library или -p library. Например:

$ kotlinc-native foo.kt -p library -o bar

Эта команда создаст bar.klib с откомпилированным содержимым foo.kt.

Для ссылки на библиотеку используйте флаг -library <name> или -l <name>. Например:

$ kotlinc-native qux.kt -l bar

Эта команда создаст program.kexe из qux.kt и bar.klib

Особенности инструмента cinterop

Инструмент cinterop генерирует .klib обёртки для нативных библиотек в качестве основного результата. Например, используя простой libgit2.def файл определения нативной библиотеки, предоставленный в вашей дистрибуции Kotlin/Native

$ cinterop -def samples/gitchurn/src/nativeInterop/cinterop/libgit2.def -compiler-option -I/usr/local/include -o libgit2

мы получим libgit2.klib.

См. больше деталей в C Interop.

Утилита klib

Утилита управления библиотеками klib позволяет просматривать и устанавливать библиотеки.

Доступны следующие команды:

  • content – просмотреть содержимое библиотеки:

    $ klib contents <name>
    
  • info – просмотреть метаданные библиотеки

    $ klib info <name>
    
  • install – установить библиотеку в стандартное местоположение

    $ klib install <name>
    
  • remove – удалить библиотеку из стандартного репозитория

    $ klib remove <name>
    

Все вышеперечисленные команды принимают дополнительный -repository <directory> аргумент для указания репозитория, отличного от стандартного.

$ klib <command> <name> -repository <directory>

Несколько примеров

Сначала создадим библиотеку. Поместите исходный код небольшой библиотеки в kotlinizer.kt:

package kotlinizer
val String.kotlinized
    get() = "Kotlin $this"
$ kotlinc-native kotlinizer.kt -p library -o kotlinizer

Библиотека создана в текущем каталоге:

$ ls kotlinizer.klib
kotlinizer.klib

Теперь давайте посмотрим содержимое библиотеки:

$ klib contents kotlinizer

Вы можете установить kotlinizer в стандартный репозиторий:

$ klib install kotlinizer

Удалите все следы из текущего каталога:

$ rm kotlinizer.klib

Создайте очень короткую программу и поместите её в use.kt:

import kotlinizer.*

fun main(args: Array<String>) {
    println("Hello, ${"world".kotlinized}!")
}

Теперь скомпилируйте программу, связанную с библиотекой, которую вы только что создали:

$ kotlinc-native use.kt -l kotlinizer -o kohello

И запустите программу:

$ ./kohello.kexe
Hello, Kotlin world!

Приятного пользования!

Расширенные темы

Порядок поиска библиотек

При использовании флага -library foo, компилятор ищет библиотеку foo в следующем порядке:

  • Текущий каталог компиляции или абсолютный путь.

  • Все репозитории, указанные флагом -repo.

  • Библиотеки, установленные в стандартном репозитории (на данный момент стандартным является ~/.konan, но это можно изменить, задав переменную окружения KONAN_DATA_DIR).

  • Библиотеки, установленные в каталоге $installation/klib.

Формат библиотеки

Библиотеки Kotlin/Native представляют собой zip-архивы, содержащие предопределённую структуру каталогов с таким расположением:

foo.klib при распаковке как foo/ даёт:

  - foo/
    - $component_name/
      - ir/
        - Serialized Kotlin IR.
      - targets/
        - $platform/
          - kotlin/
            - Kotlin compiled to LLVM bitcode.
          - native/
            - Bitcode files of additional native objects.
        - $another_platform/
          - There can be several platform specific kotlin and native pairs.
      - linkdata/
        - A set of ProtoBuf files with serialized linkage metadata.
      - resources/
        - General resources such as images. (Not used yet).
      - manifest - A file in the java property format describing the library.

Пример структуры можно найти в каталоге klib/stdlib вашей установки.

Использование относительных путей в klibs

Использование относительных путей в klibs доступно начиная с Kotlin 1.6.20.

Сериализованное представление IR исходных файлов является частью библиотеки klib. Оно включает пути к файлам для генерации правильной отладочной информации. По умолчанию сохранённые пути являются абсолютными. С помощью опции компилятора -Xklib-relative-path-base, вы можете изменить формат и использовать только относительные пути в артефакте. Для этого передайте один или несколько базовых путей исходных файлов в качестве аргумента:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class).configureEach {
  // $base is a base path of source files
  kotlinOptions.freeCompilerArgs += "-Xklib-relative-path-base=$base"
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
  kotlinOptions {
    // $base is a base path of source files
    freeCompilerArgs += "-Xklib-relative-path-base=$base"
  }
}
Последнее изменение: 04 апреля 2022 г.
Справочник по синтаксису плагина CocoaPods Gradle Библиотеки платформы

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-libraries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API