在Kotlin Multiplatform的gradle.kts中,如何获取各目标平台的编译器?
在Kotlin Multiplatform中获取各目标平台的C++编译器路径
核心方案
无需手动查找~/.konan下的路径,直接通过Gradle的Konan扩展获取各目标平台的预配置编译器及标准库信息,逻辑和获取Android NDK目录一致。
Gradle配置示例
Groovy DSL
plugins { id 'org.jetbrains.kotlin.multiplatform' version '1.9.20' } kotlin { // 声明需要的目标平台 linuxX64() mingwX64() macosX64() iosX64() afterEvaluate { // 获取单个目标的编译器与标准库路径 def linuxToolchain = konan.targets.linuxX64.toolchain println("Linux X64 C++编译器: ${linuxToolchain.clang}") println("Linux X64 C++标准库路径: ${linuxToolchain.stdlib}") // 遍历所有已声明的目标平台 konan.targets.each { target -> def toolchain = target.toolchain println("${target.name} 编译器路径: ${toolchain.clang}") println("${target.name} 标准库路径: ${toolchain.stdlib}") } } }
Kotlin DSL
plugins { kotlin("multiplatform") version "1.9.20" } kotlin { // 声明需要的目标平台 linuxX64() mingwX64() macosX64() iosX64() afterEvaluate { // 获取单个目标的编译器与标准库路径 val linuxToolchain = konan.targets["linuxX64"].toolchain println("Linux X64 C++编译器: ${linuxToolchain.clang}") println("Linux X64 C++标准库路径: ${linuxToolchain.stdlib}") // 遍历所有已声明的目标平台 konan.targets.forEach { target -> val toolchain = target.toolchain println("${target.name} 编译器路径: ${toolchain.clang}") println("${target.name} 标准库路径: ${toolchain.stdlib}") } } }
自定义C++编译任务示例
如果要在Gradle中直接编写C++编译任务,可以参考以下配置:
Groovy DSL
tasks.register('compileCppForLinux', Exec) { // 确保Konan工具链已准备完成 dependsOn konan.targets.linuxX64.linkTask def toolchain = konan.targets.linuxX64.toolchain // 配置编译命令参数 commandLine toolchain.clang, '-std=c++17', '-I', toolchain.stdlib, 'src/nativeMain/cpp/main.cpp', '-o', 'build/output/linux/main' }
Kotlin DSL
tasks.register<Exec>("compileCppForLinux") { // 确保Konan工具链已准备完成 dependsOn(konan.targets["linuxX64"].linkTask) val toolchain = konan.targets["linuxX64"].toolchain // 配置编译命令参数 commandLine( toolchain.clang, "-std=c++17", "-I", toolchain.stdlib, "src/nativeMain/cpp/main.cpp", "-o", "build/output/linux/main" ) }
为什么不能用主机标准编译器?
Konan提供的编译器是专门为Kotlin Multiplatform预配置的,绑定了适配目标平台的专用标准库和编译参数。主机系统的默认编译器使用的是系统标准库,和Konan依赖的库符号不兼容,因此会出现符号未定义的编译错误。
内容的提问来源于stack exchange,提问作者AndrewStone
相关产品推荐
相关产品推荐

