能否使用MSBuildTools直接构建CMake项目?VS2017场景咨询
作为常年折腾CI/CD和VS CMake项目的人,我可以明确告诉你:完全不需要生成解决方案文件,就能在MSBuild构建服务器上复用VS2017里的配置完成自动化构建。下面是一步步的最优方案:
核心逻辑先搞懂
VS2017的CMake集成本质上就是调用CMake生成MSBuild格式的项目文件(.vcxproj),只是它把这些文件藏在.vs目录下不让你直接看到而已。我们要做的就是手动触发这个生成过程,然后直接用MSBuild编译这些项目文件,全程不碰.sln。
具体操作步骤
1. 先搞定构建服务器的环境
首先确保服务器上安装了VS2017 Build Tools(要包含CMake组件和对应平台的编译器工具链),然后初始化VS的环境变量——这一步很关键,不然MSBuild和CMake找不到正确的工具链。
打开命令提示符(或PowerShell),运行:
"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\Tools\VsDevCmd.bat" -arch=x64
(如果是32位项目,把-arch=x64改成-arch=x86)
2. 复用CMakeSettings.json的配置
你的CMakeSettings.json里已经定义了所有构建参数:目标平台、Debug/Release配置、CMake命令行参数、构建目录等等。我们可以直接基于这个文件生成MSBuild项目,不用手动敲一堆参数。
方法:用CMake命令行结合配置文件参数
比如你的CMakeSettings.json里有一个名为x64-Debug的配置,对应的生成器是Visual Studio 15 2017 Win64,那你可以运行:
cmake -S . -B build/x64-Debug -G "Visual Studio 15 2017 Win64" --no-warn-unused-cli -DCMAKE_BUILD_TYPE=Debug
这里的参数完全对应你在CMakeSettings.json里的配置:
-S .指定CMake源码根目录(就是你的项目根目录)-B build/x64-Debug对应配置里的buildRoot路径-G指定的生成器要和配置里的generator完全一致- 额外的CMake参数(比如
CMAKE_BUILD_TYPE)可以从配置里的cmakeCommandArgs字段直接复制过来
3. 用MSBuild直接构建
生成MSBuild项目文件后,不用管解决方案,直接编译目标项目就行。比如要构建所有目标,就用CMake自动生成的ALL_BUILD.vcxproj:
msbuild build/x64-Debug/ALL_BUILD.vcxproj /p:Configuration=Debug /p:Platform=x64 /m
/m参数启用多线程编译,加快构建速度- 如果你的项目有自定义目标(比如INSTALL),可以替换成
INSTALL.vcxproj
进阶:自动遍历CMakeSettings.json的所有配置
如果你的CMakeSettings.json里有多个配置(比如x64-Debug、x64-Release),写个PowerShell脚本自动处理所有配置会更高效,完全不用手动改参数。
示例脚本(保存为Build-CMake.ps1):
# 读取CMakeSettings.json配置 $cmakeSettings = Get-Content -Path "./CMakeSettings.json" | ConvertFrom-Json # 遍历每个配置 foreach ($config in $cmakeSettings.configurations) { # 替换配置里的占位符(比如${workspaceRoot}) $buildDir = $config.buildRoot.Replace("${workspaceRoot}", (Get-Location).Path) $generator = $config.generator $cmakeArgs = $config.cmakeCommandArgs -split '\s+' | Where-Object { $_ } # 创建构建目录 if (-not (Test-Path $buildDir)) { New-Item -ItemType Directory -Path $buildDir | Out-Null } # 生成MSBuild项目 Write-Host "Generating project for configuration: $($config.name)" cmake -S . -B $buildDir -G $generator @cmakeArgs # 开始构建 Write-Host "Building configuration: $($config.name)" msbuild "$buildDir/ALL_BUILD.vcxproj" /p:Configuration=$config.name /p:Platform=$config.platform /m }
运行这个脚本就能自动处理所有配置,完全复用你在VS里的设置。
注意事项
- CMake版本匹配:确保服务器上的CMake版本和VS2017里的一致(VS2017 Update 5自带CMake 3.12.3),避免因版本差异导致的配置兼容问题。
- 环境变量:如果你的
CMakeSettings.json里定义了environmentVariables,要在构建脚本里提前设置这些变量,或者用-D参数传递给CMake。 - 清理构建缓存:如果需要重新构建,记得删除
build目录或者用cmake --build $buildDir --clean-first命令。
内容的提问来源于stack exchange,提问作者Andreas Walter

