Библиотеки Kotlin/Native
Компиляция библиотеки
Для создания артефакта *.klib для вашей библиотеки можно использовать файл сборки проекта или компилятор Kotlin/Native.
Использование файла сборки Gradle
Вы можете скомпилировать артефакт библиотеки *.klib, указав целевую платформу Kotlin/Native в файле сборки Gradle:
-
В файле
build.gradle(.kts)объявите как минимум одну целевую платформу Kotlin/Native. Например:// build.gradle.kts plugins { kotlin("multiplatform") version "2.4.20" } kotlin { macosArm64() // on macOS // linuxArm64() // on Linux // mingwX64() // on Windows } -
Запустите задачу
<target>Klib. Например:./gradlew macosArm64Klib
Gradle автоматически компилирует исходные файлы для этой целевой платформы и создает артефакт .klib в каталоге build/libs проекта.
Использование компилятора Kotlin/Native
Чтобы создать библиотеку с помощью компилятора Kotlin/Native:
-
Чтобы скомпилировать исходный файл Kotlin/Native в библиотеку, используйте параметр
-produce libraryили-p library:kotlinc-native foo.kt -p library -o bar
Эта команда компилирует содержимое файла
foo.ktв библиотеку с именемbarи создает артефактbar.klib. -
Чтобы связать другой файл с библиотекой, используйте параметр
-library <name>или-l <name>. Например:kotlinc-native qux.kt -l bar
Эта команда компилирует содержимое исходного файла
qux.ktи библиотекиbar.klibи создает итоговый исполняемый двоичный файлprogram.kexe.
Утилита klib
Утилита управления библиотеками klib позволяет изучать библиотеки с помощью следующего синтаксиса:
klib <command> <library path> [<option>]
В настоящее время доступны следующие команды:
Команда |
Описание |
|---|---|
|
Общая информация о библиотеке. |
|
Вывести снимок ABI библиотеки. Каждая строка снимка соответствует одному объявлению. Если в объявлении произойдет несовместимое с ABI изменение, оно будет видно в соответствующей строке снимка. |
|
Вывести промежуточное представление (IR) объявлений библиотеки. Используйте только для отладки. |
|
Вывести сигнатуры IR всех непубличных объявлений библиотеки и всех непубличных объявлений, используемых этой библиотекой (в виде двух отдельных списков). Эта команда использует только данные из IR. |
|
Вывести IR встраиваемых функций библиотеки. Используйте только для отладки. |
|
Вывести метаданные всех объявлений библиотеки. Используйте только для отладки. |
|
Вывести сигнатуры IR всех непубличных объявлений библиотеки на основе метаданных библиотеки. В большинстве случаев результат совпадает с результатом команды |
Все перечисленные выше команды для вывода данных принимают дополнительный аргумент -signature-version {N}, указывающий утилите klib, какую версию сигнатур IR использовать при их выводе. Если аргумент не задан, используется самая актуальная версия, поддерживаемая библиотекой. Например:
klib dump-metadata-signatures mylib.klib -signature-version 1
Кроме того, команда dump-metadata принимает аргумент -print-signatures {true|false}, который указывает утилите klib выводить сигнатуры IR для каждого объявления.
Создание и использование библиотеки
-
Создайте библиотеку, поместив исходный код в
kotlinizer.kt:package kotlinizer val String.kotlinized get() = "Kotlin $this" -
Скомпилируйте библиотеку в
.klib:kotlinc-native kotlinizer.kt -p library -o kotlinizer
-
Проверьте, появилась ли созданная библиотека в текущем каталоге:
ls kotlinizer.klib
-
Просмотрите общую информацию о библиотеке:
klib info kotlinizer.klib
-
Создайте небольшую программу в файле
use.kt:import kotlinizer.* fun main(args: Array<String>) { println("Hello, ${"world".kotlinized}!") } -
Скомпилируйте программу, связав исходный файл
use.ktс библиотекой:kotlinc-native use.kt -l kotlinizer -o kohello
-
Запустите программу:
./kohello.kexe
В результате вы должны увидеть Hello, Kotlin world!.
Порядок поиска библиотек
Если указан параметр -library foo, компилятор ищет библиотеку foo в следующем порядке:
Текущий каталог компиляции или абсолютный путь.
-
Библиотеки, установленные в репозитории по умолчанию.
Библиотеки, установленные в каталоге
$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/common/stdlib в папке установки компилятора Kotlin/Native.
Использование относительных путей в klib
Сериализованное представление IR исходных файлов — часть библиотеки klib. Оно содержит пути к файлам, необходимые для создания корректной отладочной информации. По умолчанию сохраняются абсолютные пути.
С помощью параметра компилятора -Xklib-relative-path-base можно изменить формат и использовать в артефакте только относительные пути. Для этого передайте в качестве аргумента один или несколько базовых путей к исходным файлам:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
// $base is a base path of source files
compilerOptions.freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named('compileKotlin', KotlinCompilationTask) {
compilerOptions {
// $base is a base path of source files
freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
}
Что дальше?
Узнайте, как использовать инструмент cinterop для создания артефактов *.klib
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-libraries.html