본문으로 건너뛰기

Kotlin/Native FAQ

프로그램을 어떻게 실행하나요?

최상위 함수 fun main(args: Array<String>)를 정의하거나, 전달된 인수에 관심이 없다면 fun main()만 정의하십시오. 패키지 내에 있지 않도록 하십시오. 또한 컴파일러 스위치 -entry를 사용하면 Array<String>을 인수로 받거나 인수가 없고 Unit을 반환하는 모든 함수를 진입점으로 사용할 수 있습니다.

Kotlin/Native 메모리 관리 모델은 무엇인가요?

Kotlin/Native는 Java 또는 Swift에서 제공하는 것과 유사한 자동 메모리 관리 체계를 사용합니다.

Kotlin/Native 메모리 관리자에 대해 알아보기

공유 라이브러리를 어떻게 만드나요?

-produce dynamic 컴파일러 옵션 또는 Gradle 빌드 파일에서 binaries.sharedLib()를 사용하십시오.

kotlin {
iosArm64("mylib") {
binaries.sharedLib()
}
}

이는 플랫폼별 공유 객체(Linux에서는 .so, macOS에서는 .dylib, Windows 대상에서는 .dll)와 C 언어 헤더를 생성하여 C/C++ 코드에서 Kotlin/Native 프로그램에서 사용할 수 있는 모든 public API를 사용할 수 있도록 합니다.

동적 라이브러리 튜토리얼로 Kotlin/Native 완료하기

정적 라이브러리 또는 객체 파일을 어떻게 만드나요?

-produce static 컴파일러 옵션 또는 Gradle 빌드 파일에서 binaries.staticLib()를 사용하십시오.

kotlin {
iosArm64("mylib") {
binaries.staticLib()
}
}

이는 플랫폼별 정적 객체(.a 라이브러리 형식)와 C 언어 헤더를 생성하여 C/C++ 코드에서 Kotlin/Native 프로그램에서 사용할 수 있는 모든 public API를 사용할 수 있도록 합니다.

회사 프록시 뒤에서 Kotlin/Native를 어떻게 실행하나요?

Kotlin/Native는 플랫폼별 툴체인을 다운로드해야 하므로 컴파일러 또는 gradlew 인수로 -Dhttp.proxyHost=xxx -Dhttp.proxyPort=xxx를 지정하거나 JAVA_OPTS 환경 변수를 통해 설정해야 합니다.

Kotlin 프레임워크에 대한 사용자 정의 Objective-C 접두사/이름을 어떻게 지정하나요?

-module-name 컴파일러 옵션 또는 일치하는 Gradle DSL 구문을 사용하십시오.

kotlin {
iosArm64("myapp") {
binaries.framework {
freeCompilerArgs += listOf("-module-name", "TheName")
}
}
}

iOS 프레임워크 이름을 어떻게 변경하나요?

iOS 프레임워크의 기본 이름은 <project name>.framework입니다. 사용자 정의 이름을 설정하려면 baseName 옵션을 사용하십시오. 이렇게 하면 모듈 이름도 설정됩니다.

kotlin {
iosArm64("myapp") {
binaries {
framework {
baseName = "TheName"
}
}
}
}

Kotlin 프레임워크에 대해 bitcode를 어떻게 활성화하나요?

Bitcode 임베딩은 Xcode 14에서 더 이상 사용되지 않고 모든 Apple 대상에 대해 Xcode 15에서 제거되었습니다. Kotlin/Native 컴파일러는 Kotlin 2.0.20 이후로 bitcode 임베딩을 지원하지 않습니다.

이전 버전의 Xcode를 사용하고 있지만 Kotlin 2.0.20 이상 버전으로 업그레이드하려면 Xcode 프로젝트에서 bitcode 임베딩을 비활성화하십시오.

InvalidMutabilityException이 보이는 이유는 무엇인가요?

노트

이 문제는 레거시 메모리 관리자에만 해당됩니다. Kotlin/Native 메모리 관리를 확인하여 Kotlin 1.7.20부터 기본적으로 활성화된 새로운 메모리 관리자에 대해 알아보세요.

이는 고정된 객체를 변경하려고 시도하기 때문에 발생할 가능성이 높습니다. 객체는 kotlin.native.concurrent.freeze가 호출된 객체에서 도달 가능한 객체로서 명시적으로 또는 암시적으로(예: enum 또는 전역 싱글톤 객체에서 도달 가능 - 다음 질문 참조) 고정 상태로 전송될 수 있습니다.

싱글톤 객체를 변경 가능하게 만들려면 어떻게 해야 하나요?

노트

이 문제는 레거시 메모리 관리자에만 해당됩니다. Kotlin/Native 메모리 관리를 확인하여 Kotlin 1.7.20부터 기본적으로 활성화된 새로운 메모리 관리자에 대해 알아보세요.

현재 싱글톤 객체는 변경 불가능하며(즉, 생성 후 고정됨) 전역 상태를 변경 불가능하게 유지하는 것이 일반적으로 좋은 방법으로 간주됩니다. 어떤 이유로든 해당 객체 내부에 변경 가능한 상태가 필요한 경우 객체에 @konan.ThreadLocal 어노테이션을 사용하십시오. 또한 kotlin.native.concurrent.AtomicReference 클래스를 사용하여 고정된 객체에 대한 다른 포인터를 고정된 객체에 저장하고 자동으로 업데이트할 수 있습니다.

릴리스되지 않은 버전의 Kotlin/Native로 프로젝트를 어떻게 컴파일할 수 있나요?

먼저 미리보기 버전을 사용해 보십시오.

최신 개발 버전이 필요한 경우 소스 코드에서 Kotlin/Native를 빌드할 수 있습니다. Kotlin 저장소를 복제하고 이러한 단계를 따르십시오.