
构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载本篇指南围绕 CMake 仓库中的 Visual Studio 17 2022 生成器文档 展开系统讲解cmake -G Visual Studio 17 2022生成器的能力边界项目类型支持、多版本实例选择CMAKE_GENERATOR_INSTANCE、目标平台/架构选择-A与CMAKE_GENERATOR_PLATFORM以及工具集选择-T、默认v143与hostx64|x86主机架构控制并结合 Source/cmGlobalVisualStudioVersionedGenerator.cxx 与 Source/cmVSVersion.h 等源码揭示生成器名称注册、工具集映射与默认平台推导的底层实现。读完本文你将能够在 Windows 上为 Visual Studio 2022 正确配置 CMake 构建并在多安装、多架构、多工具集的复杂环境中做出准确选择。一、生成器概述从 VS 2017 起的版本化生成器体系Visual Studio 17 2022 生成器用于生成 Visual Studio 2022VS 17的项目文件.sln解决方案与.vcxproj工程文件。该生成器自 CMake 3.21 起引入见 生成器文档 中的.. versionadded:: 3.21。在 CMake 源码中VS 2017 及之后的各代 VS 生成器由同一套版本化生成器基类实现通过枚举区分版本。在 Source/cmVSVersion.h 中可以看到enum class Version : std::uint16_t { VS15 150, // Visual Studio 15 2017 VS16 160, // Visual Studio 16 2019 VS17 170, // Visual Studio 17 2022 VS18 180, // Visual Studio 18 2026 };而生成器名称注册于 Source/cmGlobalVisualStudioVersionedGenerator.cxxstatic char const vs17generatorName[] Visual Studio 17 2022;使用方式非常简单cmake -G Visual Studio 17 2022 -S 源目录 -B 构建目录生成器名称同样支持省略年份的别名例如直接使用Visual Studio 17由cmVS17GenName负责把不带年份的名称映射到带年份的完整名称。此外仓库中还提供了新一代 Visual Studio 18 2026 生成器文档其默认工具集为v145可作为横向对比参考。二、项目类型支持边界根据 生成器文档 的 Project Types 一节该生成器仅支持生成以下项目类型Visual CC/C项目C# 项目带 Intel 编译器集成的 Fortran 项目。不支持的其它项目类型包括JavaScript、PowerShell、Python 等。因此在使用该生成器前请确认项目的语言构成——例如纯脚本语言项目不应选择该生成器。这一边界与 CMake 的整体语言支持体系一致project()中启用的语言如C、CXX、CSharp、Fortran会被映射到对应的 VS 项目文件类型而未被 VS 生成器支持的脚本语言则无法生成。三、实例选择多安装环境下的 VS 2022 定位VS 2022 允许在同一台机器上安装多个实例不同通道、不同版本CMake 通过 CMAKE_GENERATOR_INSTANCE 变量选择具体使用哪一个实例。该变量支持以下三种形式形式说明locationVS 安装顶层目录的绝对路径location[,keyvalue]*位置 逗号分隔的键值选项keyvalue[,keyvalue]*仅键值选项支持的键值选项目前为versionmajor.minor.date.buildCMake 3.23 起即 VS 的四段式 Build 版本号Build Number。当同时提供location与version时还可以指定一个 Visual Studio Installer 未知的便携式portableVS 实例便于使用绿色版/便携版 VS。根据 CMAKE_GENERATOR_INSTANCE 文档 的说明实例选择的完整流程为若用户未显式设置CMAKE_GENERATOR_INSTANCE缓存项或环境变量或由工具链文件初始化CMake 会查询 Visual Studio Installer 自动定位 VS 实例若环境变量VS##0COMNTOOLS##为 VS 主版本号即VS170COMNTOOLS已设置且指向某实例的Common7/Tools目录则该实例被优先采用否则若机器上装有多个实例CMake 不承诺默认选择哪一个行为未定义需显式指定选定实例的 VS Build 版本号会体现在 CMAKE_VS_VERSION_BUILD_NUMBER 变量中。需要强调一旦构建目录以特定实例初始化之后再改变CMAKE_GENERATOR_INSTANCE属于未定义行为项目代码也不应修改该变量。四、平台选择目标架构-A与 Windows SDK4.1 默认平台名VS 2022 生成器的默认目标平台名架构为宿主平台架构其值通过 CMAKE_VS_PLATFORM_NAME_DEFAULT 变量提供。该变量的语义为对 VS 2017 及更早的生成器默认恒为Win32对VS 2019 及更新的生成器含 VS 17 2022默认值基于宿主平台。从源码看宿主平台由VSHostPlatformName()判定见 Source/cmGlobalVisualStudioVersionedGenerator.cxxARM64 宿主返回ARM64WOW6432 位进程跑在 64 位系统上返回x64其余按编译宏返回Win32/x64/ARM/Itanium。也就是说在常见的 x64 Windows 上不指定-A时默认目标架构就是 x64。4.2 通过-A显式指定架构生成器文档 给出的四个典型组合cmake -G Visual Studio 17 2022 -A Win32 cmake -G Visual Studio 17 2022 -A x64 cmake -G Visual Studio 17 2022 -A ARM cmake -G Visual Studio 17 2022 -A ARM64-A选项对应 CMAKE_GENERATOR_PLATFORM 变量其取值形式为platform、platform[,keyvalue]*或keyvalue[,keyvalue]*。被选中的平台名会写入 CMAKE_VS_PLATFORM_NAME 变量。从源码的GetKnownPlatforms()Source/cmGlobalVisualStudioVersionedGenerator.cxx可以看到 VS 2017 及之后生成器支持的平台集合正是x64、Win32、ARM、ARM64与文档完全一致std::vectorstd::string GetKnownPlatforms() const override { std::vectorstd::string platforms; platforms.emplace_back(x64); platforms.emplace_back(Win32); platforms.emplace_back(ARM); platforms.emplace_back(ARM64); return platforms; }4.3 平台选项指定 Windows SDK 版本除架构外CMAKE_GENERATOR_PLATFORM 还支持versionversion键值对CMake 3.27 起VS 2015 及以上可用用于指定 Windows SDK 版本取值有三种取值含义10.0允许任意 10.0 SDK由 Visual Studio 自行挑选VS 2019 及以上支持10.0.build.increment精确指定四段式 SDK 版本如10.0.19041.0该版本必须已安装8.1指定 8.1 SDKVS 2017 及以上需另行安装 8.1 SDK示例cmake -G Visual Studio 17 2022 -A x64 -A version10.0.19041.0对应的实际 SDK 版本会写入 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 变量未指定时由 CMake 按该变量文档描述的规则自动选择。五、工具集选择默认v143与-T覆盖5.1 默认工具集VS 17 2022 随附的 C 工具集为v143这也是该生成器的默认工具集见 生成器文档 的 Toolset Selection 一节。源码中的工具集映射函数印证了这一点Source/cmGlobalVisualStudioVersionedGenerator.cxxstatic char const* VSVersionToToolset(cmGlobalVisualStudioGenerator::VSVersion v) { switch (v) { case VS15: return v141; case VS16: return v142; case VS17: return v143; // Visual Studio 17 2022 case VS18: return v145; // Visual Studio 18 2026 } return ; }5.2 通过-T指定其它工具集通过cmake -T选项或 CMAKE_GENERATOR_TOOLSET 变量可以覆盖默认工具集。例如使用 VS 2022 环境中的另一工具集版本cmake -G Visual Studio 17 2022 -T v143,version14.40选中的工具集名会体现在 CMAKE_VS_PLATFORM_TOOLSET 变量中。5.3 工具集键值选项CMAKE_GENERATOR_TOOLSET 文档列出了toolset、toolset[,keyvalue]*、keyvalue[,keyvalue]*三种形式支持的键值选项包括选项说明cudaversion|path指定 CUDA 工具包版本或独立 CUDA 工具包目录VS 2010 及以上版本形式要求 CUDA 的 VS 集成全局安装fortrancompilerCMake 3.29 起指定 Fortran 编译器ifortIntel classic或ifxIntel oneAPI要求对应 VS Integration 功能已安装hostarch指定宿主工具架构为x64或x86VS 2013 及以上versionversion指定工具集版本号VS 2017 及以上需已安装对应工具集VCTargetsPathpath为 VS 工程文件指定替代的VCTargetsPath可用于加载未随 VS 安装的.props/.targets平台扩展典型用法示例# 使用 Intel oneAPI Fortran 编译器 cmake -G Visual Studio 17 2022 -T fortranifx # 指定 CUDA 工具包 cmake -G Visual Studio 17 2022 -T cuda12.2六、工具集主机架构hostx64/hostx86每个随 VS 2022 分发的工具集都存在面向 32 位x86与 64 位x64宿主的两个变体与工具集自身的目标架构无关详见 VS_TOOLSET_HOST_ARCH.rst。默认选择规则来自 生成器文档 与 include 片段x64 宿主默认使用 64 位变体其它情况默认使用 32 位变体。如需显式指定在工具集说明中追加hostx86或hostx64# 强制使用 32 位宿主工具 cmake -G Visual Studio 17 2022 -T v143,hostx86 # 强制使用 64 位宿主工具 cmake -G Visual Studio 17 2022 -T v143,hostx64CMake 会把最终选择记录在 CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE 变量中其取值可能为x86、x64、ARM64或空值。从源码看默认宿主架构同样由平台检测逻辑推导Source/cmGlobalVisualStudioVersionedGenerator.cxx 中的VSHostArchitecture()ARM64 宿主VS17 起返回ARM64WOW64 进程返回x6464 位进程返回x6432 位进程返回x86。值得注意的是该函数对 VS 17 专门处理了 ARM64 宿主场景这也与 VS 2022 对 ARM64 开发设备的支持相呼应。七、组合实战一份完整的 VS 2022 构建命令参考将以上要点组合起来下面是一组可直接复用的构建命令模板# 1) 64 位 x64 目标x64 宿主上的默认架构最常用 cmake -G Visual Studio 17 2022 -S . -B build-x64 # 2) 显式指定 32 位 Win32 目标 cmake -G Visual Studio 17 2022 -A Win32 -S . -B build-win32 # 3) ARM64 目标如 Windows on ARM 设备 cmake -G Visual Studio 17 2022 -A ARM64 -S . -B build-arm64 # 4) 指定 Windows SDK 版本 cmake -G Visual Studio 17 2022 -A x64 -A version10.0.19041.0 -S . -B build-sdk # 5) 指定工具集版本并强制 64 位宿主工具 cmake -G Visual Studio 17 2022 -T v143,version14.40,hostx64 -S . -B build-toolset # 6) 在多实例环境中锁定 VS 2022 实例CMake 3.23 支持 version 键 cmake -G Visual Studio 17 2022 -DCMAKE_GENERATOR_INSTANCEC:\Program Files\Microsoft Visual Studio\2022\Community,version17.8.6.0 -S . -B build-instance构建阶段建议配合cmake --build与--config指定配置Debug/Release/RelWithDebInfo/MinSizeRelcmake --build build-x64 --config Release八、注意事项与约束小结变量不可覆盖CMAKE_GENERATOR_INSTANCE、CMAKE_GENERATOR_PLATFORM、CMAKE_GENERATOR_TOOLSET一旦初始化后续修改属于未定义行为项目代码不应修改这些变量工具链文件除外。平台/工具集合法性SDK 版本、工具集版本均要求本机已安装对应组件CUDA 版本形式需要 CUDA 的 VS 集成。语言支持有限仅 C、C# 与带 Intel 集成的 Fortran脚本类项目不支持。环境变量等价形式CMAKE_GENERATOR_PLATFORM、CMAKE_GENERATOR_TOOLSET、CMAKE_GENERATOR_INSTANCE均存在同名环境变量形式可作为命令行之外的第二选择。适用前提本指南所有描述基于当前仓库CMake 主线源码中 VS 17 2022 生成器的实现其中部分能力如fortran工具集选项、version平台选项有明确的最低版本要求请以对应变量文档标注的versionadded为准。九、延伸阅读Visual Studio 17 2022 生成器文档本文核心依据Visual Studio 16 2019 生成器文档上一代生成器默认工具集v142结构完全一致Visual Studio 18 2026 生成器文档下一代生成器默认工具集v145CMAKE_GENERATOR_INSTANCE实例选择细节与 Build 版本号CMAKE_GENERATOR_PLATFORM平台与 Windows SDK 选择细节CMAKE_GENERATOR_TOOLSET工具集与 CUDA/Fortran/host 选项CMAKE_VS_PLATFORM_NAME_DEFAULT默认平台名推导规则CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE宿主工具架构记录Source/cmGlobalVisualStudioVersionedGenerator.cxx生成器注册、平台推导与工具集映射的实现Source/cmVSVersion.hVS 版本枚举定义赞分享构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载相关推荐HIXL 流水线失败详情排查实战OpenLiBingSPA页面定位 codecheck 与编译/LLT 失败根因HIXL 流水线失败详情排查实战OpenLiBingSPA页面定位 codecheck 与编译/LLT 失败根因 本篇技术指南面向在 cann/hixl构建工具开发工具CLI如何快速实现slambook2跨平台编译Windows下CMake与Visual Studio完美集成指南如何快速实现slambook2跨平台编译Windows下CMake与Visual Studio完美集成指南 SLAM同时定位与地图构建技术是机器人视觉导航示例工程华硕笔记本免折腾性能控制GHelper 一次调好风扇曲线、显卡模式与充电上限华硕笔记本免折腾性能控制GHelper 一次调好风扇曲线、显卡模式与充电上限 切一次性能模式要等奥创加载半天还嫌它后台占资源GHelper 把华硕 ROG构建工具开发工具CLI上一篇如何实现PGMQ消息归档与重放企业级数据保留策略全指南下一篇抖音无水印视频下载神器F2工具全面解析与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考