You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:30:14