如何在CMakeLists.txt / CMakePresets.json中直接设置Release模式?使用Visual Studio 18 2026、VSCode、vcpkg构建示例库“google/benchmark”

编程语言 2026-07-09

在使用CMake时,如何以 Release 模式指定编译?理想是在 "CMakeLists.txt" 中,但若不行,则在 "CMakePresets.json" 中。

寻找一个尽量不使用命令的解决方案,因为这个问题是关于在VSCode中工作时,通过编辑器窗口底部框的Launch/Build按钮来启动编译。因此,若只提供“命令解决方案”,则只在需要给其他编辑器时作为补充。目标是在CMakeLists.txt或 CMakePresets.json直接指定该设置。

我在多个帖子中都看到过这个问题,但没有一个选项奏效,要么显示编译错误,要么在 Debug 模式下编译,只生成路径 "build > Debug"。

关于本问题的额外背景:

  • 在VSCode(Windows)上工作,当前使用 "Visual Studio 18 2026" 进行编译,然而理想的解决方案是一个跨平台的方法来指定 Release 编译模式(以及在需要时指定 Debug 模式)。
  • 使用不同的CMake指令尝试获取Release编译模式的测试在下方的文件中有展示,但对一个仅有 "main.cpp" 的简单 “Hello World!” 程序并未成功。通过这些测试,总是得到 Debug编译模式。不过,计划是在使用像vcpkg这样的包管理器时扩展该解决方案。
  • 一个实际的场景是使用vcpkg默认方式下载的库 "google/benchmark",就参考而言,它是会进行编译的,但和其他程序一样,CMake只会创建一个 "Debug" 子文件夹,因此该库会显示如下信息:
    WARNING Library was built as DEBUG. Timings may be affected.

CMakeLists.txt

cmake_minimum_required(VERSION 3.30)

project(project_A VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# set(CMAKE_BUILD_TYPE Release)
# set(CMAKE_BUILD_TYPE release)
# set(cacheVariables.CMAKE_BUILD_TYPE Release)
# set(CMAKE_BUILD_TYPE "Release")
# set(CMAKE_BUILD_TYPE Debug)
# SET(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)
# set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "Build types" FORCE)
# set(CMAKE_CONFIGURATION_TYPES Release)
# set(CMAKE_CONFIGURATION_TYPES "Release")
# set(CMAKE_DEFAULT_BUILD_TYPE Release)

# if(MSVC)
#   # set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2 /DNDEBUG")
#   # if (BENCHMARK_ENABLE_LTO)
#   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL")
#   set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG")
#   set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG")
#   set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
#   # endif()
# endif()

# find_package(benchmark REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

# target_compile_options(${PROJECT_NAME} PRIVATE
#   $<$<CONFIG:Release>:/O2 /DNDEBUG>  # MSVC Release flags
#   #$<$<CONFIG:Debug>:/Od /Zi>         # MSVC Debug flags (optional)
# )

# target_compile_definitions(${PROJECT_NAME} PRIVATE RELEASE_BUILD)

# target_link_libraries(${PROJECT_NAME} PRIVATE benchmark::benchmark)

CMakePresets.json

{
  "version": 9,
  "configurePresets": [
    {
      "name": "VS and vcpkg",
      "displayName": "VS and vcpkg",
      "generator": "Visual Studio 18 2026",
      "architecture": "x64",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "path/to/vcpkg/installation/.../vcpkg.cmake",
        "VCPKG_TARGET_TRIPLET": "x64-windows"
      }
    }
  ]
}

也尝试在 "CMakePresets.json" > "cacheVariables" 中设置如下:

...
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "path/to/vcpkg/installation/.../vcpkg.cmake",
        "VCPKG_TARGET_TRIPLET": "x64-windows",
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_CONFIGURATION_TYPES": "Release"
      }
...

关于这一主题的讨论已访问过的帖子:

Debug vs Release in CMake

How to change the build type to Release mode in cmake?

How to control build mode(debug or release) in cmake?

CMAKE_BUILD_TYPE is not being used in CMakeLists.txt

更新1

在前面的帖子的一些评论之后,我在 CMakeLists.txt 里尝试了如下格式:

cmake_minimum_required(VERSION 3.30)


set(CMAKE_BUILD_TYPE Release)
# Error:
# "error MSB8013: This project doesn't contain the Configuration and Platform combination of Debug|x64... -- exited with code: 1"


set(CMAKE_CONFIGURATION_TYPES "Release;MinSizeRel;RelWithDebInfo;Debug" CACHE STRING "" FORCE)
# Error, and the terminal crashes when compiling:
# (x) The terminal process failed to launch: Starting directory (cwd) "...\project_A\build\Release" doesn't exist.


project(project_A VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ...

更新2

目前,要想让“Release”文件夹被创建,并且显然得到“Release构建”,只能通过带命令的编译来实现:

cmake --build . --config Release

经过多次测试,试图在不使用命令的情况下实现Release模式的编译,似乎部分问题源于VSCode的 "CMake Tools" 扩展。

以下是关于这方面的一条讨论:

How to set CMake build configuration in VSCode?

关于VSCode的 "CMake Tools" 扩展,直至2026年 4月仍有以下问题:

  • 过去几年,"CMake Tools" 扩展自带的 "Status Bar"(编辑器窗口底部框架)默认是完全可见,但现在扩展的可见性变成了基础/简化版。可以在扩展设置中更改:Status Bar Visibility > 选择 "visible";但显然,像往年一样的完全可见性应该是默认的,或者至少在编辑器窗口前面有一个切换按钮,快速在不修改扩展设置的情况下改变它。
  • 过去,"CMake Tools" 扩展的 "Status Bar" 在完全可见时会有一个按钮 "(i) CMake: [Debug]: Ready",但现在在选择了 Bar full visibility 之后,发现该按钮已缺失。缺失的按钮似乎具备快速切换并在构建模式之间选择的功能Debug, Release, ...
  • 过去,扩展还提供一个名为 "CMake: Select Variant" 的选项,可以选择 Release 构建变体:按Ctrl + Shift + P > 输入 CMake: Select Variant。但当前可见的是该选项已消失,其他帖子中的用户也在讨论这一缺失。

所以,到目前为止,我看到的结论是,这些问题在以往版本的 "CMake Tools" 扩展中并非问题。

解决方案

经过大量测试,找到了选择 Release 编译模式的办法!

具体来说,在 CMakePresets.json 文件中,在 "configurePresets" > "cacheVariables" 区段添加以下这一行:

"CMAKE_BUILD_TYPE": "Release"

要点如下:

  • 这一行是用于 CMakePresets.json 文件,而不是像其他帖子所建议的那样写在CMakeLists.txt文件中。
  • 找到了一份参考,给出所需的确切语法,当你对CMake的一般使用经验相对有限时,这一点尤为关键。

现在,在多次测试并结合本问题的背景,使用这行即可在多种模式下轻松选择编译,例如在 "Release" 模式或 "Debug" 模式等。

因此,这个方案满足以下几点要求:

  • 简化且直接。只有一行,没有额外的配置文件。
  • 易于理解。
  • 在CMakePresets.json文件中出现前述设定行后,通过VSCode的 CMake Tools 按钮 LaunchBuild 启动编译时即可无需命令。

因此,CMake文件的基本结构大致如下:

CMakeLists.txt

cmake_minimum_required(VERSION 3.30)

project(project_A VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(${PROJECT_NAME} main.cpp)

CMakePresets.json

{
  "version": 9,
  "configurePresets": [
    {
      "name": "VS and vcpkg",
      "displayName": "VS and vcpkg",
      "generator": "Visual Studio 18 2026",
      "architecture": "x64",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    }
  ]
}

参考资料:

https://code.visualstudio.com/docs/cpp/cmake-quickstart#_create-a-cmakepresetsjson-file

感谢用户 @int-main,在下一个帖子中的某条评论里给出的帮助:

VSCode CMake targets - what is it and how to use it?

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

相关文章