メインコンテンツまでスキップ

Kotlin/Native ライブラリ

Kotlinコンパイラー固有の仕様

Kotlin/Nativeコンパイラーでライブラリーを作成するには、-produce libraryまたは-p libraryフラグを使用します。例:

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

このコマンドは、foo.ktのコンパイルされた内容を含むbar.klibを生成します。

ライブラリーにリンクするには、-library <name>または-l <name>フラグを使用します。例:

$ kotlinc-native qux.kt -l bar

このコマンドは、qux.ktbar.klibからprogram.kexeを生成します。

cinteropツールの固有の仕様

cinteropツールは、ネイティブライブラリー用の.klibラッパーを主な出力として生成します。 たとえば、Kotlin/Nativeディストリビューションで提供されている単純なlibgit2.defネイティブライブラリー定義ファイルを使用します。

$ 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です。kotlin.data.dir Gradleプロパティーを設定することで変更できます。

    または、-Xkonan-data-dirコンパイラーオプションを使用して、cinteropおよびkonancツールを介してディレクトリーへのカスタムパスを構成できます。

  • $installation/klibディレクトリーにインストールされているライブラリー。

ライブラリー形式

Kotlin/Nativeライブラリーは、定義済みのディレクトリー構造を含むzipファイルであり、次のレイアウトになっています。

foo.klibfoo/として解凍すると、次のようになります。

  - 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ディレクトリーにあります。

klibでの相対パスの使用

注記

klibでの相対パスの使用は、Kotlin 1.6.20以降で使用できます。

ソースファイルのシリアライズされたIR表現は、klibライブラリーの一部です。これには、適切なデバッグ情報を生成するためのファイルのパスが含まれます。デフォルトでは、保存されているパスは絶対パスです。-Xklib-relative-path-baseコンパイラーオプションを使用すると、形式を変更して、アーティファクトで相対パスのみを使用できます。機能させるには、ソースファイルの1つまたは複数のベースパスを引数として渡します。

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")
}