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.kt
와 bar.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
– 라이브러리 내용 나열:bash$ klib contents <name>
info
– 라이브러리의 내부 관리 세부 정보를 검사합니다.bash$ klib info <name>
install
– 라이브러리를 기본 위치에 설치합니다.bash$ klib install <name>
remove
– 라이브러리를 기본 레포지토리에서 제거합니다.bash$ 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.klib
를 foo/
로 압축 해제하면 다음을 얻을 수 있습니다:
- 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)를 하나 이상 인수로 전달하세요:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
// $base는 소스 파일의 기준 경로입니다.
compilerOptions.freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named('compileKotlin', KotlinCompilationTask) {
compilerOptions {
// $base는 소스 파일의 기준 경로입니다.
freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
}