在CMake的构建预设中,如何为Ninja Multi-Config生成器选择配置?

编程语言 2026-07-12

我正在使用CMake 3.22.1和 Ninja 1.10.1。

除非我强制使用 --config 进行配置,它总是构建 Debug,仿佛按如下规则:

如果变量 [CMAKE_DEFAULT_BUILD_TYPE] 未指定,则使用CMAKE_CONFIGURATION_TYPES的第一项。

但我确实设置了 CMAKE_DEFAULT_BUILD_TYPE

这是我的CMakePresets.json:

{
    "version": 3,
    "cmakeMinimumRequired": {
        "major": 3,
        "minor": 22
    },
    "configurePresets": [{
        "name": "default",
        "binaryDir": "build",
        "environment": { "CMAKE_CONFIGURATION_TYPES": "Debug;RelWithDebug" },
        "generator": "Ninja Multi-Config"
    }]
}

这是我的CMakeUserPresets.json:

{
    "version": 3,
    "cmakeMinimumRequired": {
        "major": 3,
        "minor": 22
    },
    "buildPresets": [{
        "name": "default",
        "configurePreset": "default",
        "environment": { "CMAKE_CONFIGURATION_TYPES": "RelWithDebug", "CMAKE_BUILD_TYPE": "RelWithDebug", "CMAKE_DEFAULT_BUILD_TYPE": "RelWithDebug" }
    },{
        "name": "debug",
        "environment": { "CMAKE_CONFIGURATION_TYPES": "Debug", "CMAKE_BUILD_TYPE": "Debug", "CMAKE_DEFAULT_BUILD_TYPE": "Debug" },
        "inherits": "default"
    }]
}

请注意,我添加的变量其实比需要的还多。—— 实际上我已经尝试了三者的所有排列组合,但都无济于事。根据手册,只有CMAKE_DEFAULT_BUILD_TYPE应该是需要的!(https://cmake.org/cmake/help/v3.22/variable/CMAKE_DEFAULT_BUILD_TYPE.html#variable:CMAKE_DEFAULT_BUILD_TYPE)

我需要做哪些修改,才能让
cmake --build --preset=default 实际构建 RelWithDebug
并且只让
cmake --build --preset=debug 构建 Debug

另外,顺便提一句,当CLion 2025.2 RC解析这些预设时,总是会在调用中显式添加 --config=Debug,但我认为这是CLion的一个bug——它本来根本就不应该添加该参数,在它根据前缀创建的(只读)设置中,它声称自己不会这样做。

解决方案

CMAKE_DEFAULT_BUILD_TYPE 是三者中实际影响Ninja Multi-Config的唯一变量,但它并不被视为一个 环境变量

必须把 configuration key 包含在 buildPresets 中:

{
    "version": 3,
    "cmakeMinimumRequired": {
        "major": 3,
        "minor": 22
    },
    "buildPresets": [{
        "name": "default",
        "configuration": "RelWithDebug",
        "configurePreset": "default"
    },{
        "name": "debug",
        "configuration": "Debug",
        "inherits": "default"
    }]
}

然后在命令行和CLion中都能工作。

(后者仍然显式设置 --config,但它会发现正确的值,所以这是多余但无害的。)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章