Библиотеки 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
Сериализованное представление IR-кода исходных файлов является частью библиотеки klib. Она включает пути к файлам для генерации правильной отладочной информации. По умолчанию сохранённые пути являются абсолютными. С помощью опции компилятора -Xklib-relative-path-base вы можете изменить формат и использовать только относительные пути в артефакте. Для этого передайте один или несколько базовых путей исходных файлов в качестве аргумента:
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask::class).configureEach {
// $base is a base path of source files
compilerOptions.freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask).configureEach {
compilerOptions {
// $base is a base path of source files
freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
}
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-libraries.html