Skip to content

Kotlin/Native 라이브러리

Kotlin 컴파일러 세부 정보

Kotlin/Native 컴파일러로 라이브러리를 생성하려면 -produce library 또는 -p library 플래그를 사용하세요. 예를 들어:

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

이 명령어는 foo.kt의 컴파일된 내용을 담은 bar.klib를 생성합니다.

라이브러리에 링크하려면 -library <name> 또는 -l <name> 플래그를 사용하세요. 예를 들어:

bash
$ kotlinc-native qux.kt -l bar

이 명령어는 qux.ktbar.klib를 이용하여 program.kexe를 생성합니다.

cinterop 도구 세부 정보

cinterop 도구는 네이티브 라이브러리용 .klib 래퍼를 주요 출력물로 생성합니다. 예를 들어, Kotlin/Native 배포판에 포함된 간단한 libgit2.def 네이티브 라이브러리 정의 파일을 사용하여

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

libgit2.klib를 얻을 수 있습니다.

자세한 내용은 C Interop에서 확인하세요.

klib 유틸리티

klib 라이브러리 관리 유틸리티를 사용하면 라이브러리를 검사하고 설치할 수 있습니다.

다음 명령어를 사용할 수 있습니다:

  • content – 라이브러리 내용 나열:

    bash
    $ klib contents <name>
  • info – 라이브러리의 내부 관리 세부 정보를 검사합니다.

    bash
    $ klib info <name>
  • install – 라이브러리를 기본 위치에 설치합니다.

    bash
    $ klib install <name>
  • remove – 라이브러리를 기본 레포지토리에서 제거합니다.

    bash
    $ klib remove <name>

위에 언급된 모든 명령어는 기본 레포지토리와 다른 레포지토리를 지정하기 위한 추가 -repository <directory> 인수를 허용합니다.

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

몇 가지 예시

먼저 라이브러리를 생성해 봅시다. 작은 라이브러리 소스 코드를 kotlinizer.kt에 넣으세요:

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

라이브러리가 현재 디렉토리에 생성되었습니다:

bash
$ ls kotlinizer.klib
kotlinizer.klib

이제 라이브러리 내용을 확인해 봅시다:

bash
$ klib contents kotlinizer

kotlinizer를 기본 레포지토리에 설치할 수 있습니다:

bash
$ klib install kotlinizer

현재 디렉토리에서 해당 흔적을 모두 제거하세요:

bash
$ rm kotlinizer.klib

아주 짧은 프로그램을 생성하여 use.kt에 넣으세요:

kotlin
import kotlinizer.*

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

이제 방금 생성한 라이브러리와 링크하여 프로그램을 컴파일하세요:

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

그리고 프로그램을 실행하세요:

bash
$ ./kohello.kexe
Hello, Kotlin world!

즐거운 시간 되시길 바랍니다!

고급 주제

라이브러리 검색 순서

-library foo 플래그가 주어지면 컴파일러는 다음 순서로 foo 라이브러리를 검색합니다:

  • 현재 컴파일 디렉토리 또는 절대 경로.

  • -repo 플래그로 지정된 모든 레포지토리.

  • 기본 레포지토리에 설치된 라이브러리.

    기본 레포지토리는 ~/.konan입니다. kotlin.data.dir Gradle 프로퍼티를 설정하여 변경할 수 있습니다.

    또는 -Xkonan-data-dir 컴파일러 옵션을 사용하여 cinteropkonanc 도구를 통해 디렉토리의 사용자 지정 경로를 구성할 수 있습니다.

  • $installation/klib 디렉토리에 설치된 라이브러리.

라이브러리 형식

Kotlin/Native 라이브러리는 미리 정의된 디렉토리 구조를 포함하는 zip 파일이며, 다음 레이아웃을 가집니다:

foo.klibfoo/로 압축 해제하면 다음을 얻을 수 있습니다:

text
  - foo/
    - $component_name/
      - ir/
        - 직렬화된 Kotlin IR.
      - targets/
        - $platform/
          - kotlin/
            - LLVM 비트코드로 컴파일된 Kotlin.
          - native/
            - 추가 네이티브 객체의 비트코드 파일.
        - $another_platform/
          - 여러 플랫폼별 Kotlin 및 네이티브 쌍이 있을 수 있습니다.
      - linkdata/
        - 직렬화된 링크 메타데이터를 포함하는 ProtoBuf 파일 세트.
      - resources/
        - 이미지와 같은 일반 리소스. (아직 사용되지 않음).
      - manifest - 라이브러리를 설명하는 Java 속성 형식의 파일.

예시 레이아웃은 설치된 klib/stdlib 디렉토리에서 찾을 수 있습니다.

klib에서 상대 경로 사용

klib에서 상대 경로 사용은 Kotlin 1.6.20부터 가능합니다.

소스 파일의 직렬화된 IR 표현은 klib 라이브러리의 일부입니다. 이는 올바른 디버그 정보 생성을 위한 파일 경로를 포함합니다. 기본적으로 저장된 경로는 절대 경로입니다. -Xklib-relative-path-base 컴파일러 옵션을 사용하면 형식을 변경하고 아티팩트에서 상대 경로만 사용할 수 있습니다. 이 기능을 사용하려면 소스 파일의 기준 경로(base path)를 하나 이상 인수로 전달하세요:

kotlin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
    // $base는 소스 파일의 기준 경로입니다.
    compilerOptions.freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
groovy
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

tasks.named('compileKotlin', KotlinCompilationTask) {
    compilerOptions {
        // $base는 소스 파일의 기준 경로입니다.
        freeCompilerArgs.add("-Xklib-relative-path-base=$base")
    }
}