命令行调用 CMake 与 MSBuild

CMake

一个 OpenCV 的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off

set "ROOT_PATH=%~dp0"
set "OPENCV_PATH=%ROOT_PATH%\Frame\Source\ThirdParty\opencv"
echo [ opencv ] path: %OPENCV_PATH%
cd %OPENCV_PATH%

cmake -B build -D CMAKE_CONFIGURATION_TYPES="Release;Debug" -D OPENCV_DOWNLOAD_MIRROR_ID=gitcode -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_opencv_apps=OFF -D BUILD_opencv_world=ON

cmake --build build --target opencv_world --config Release
cmake --build build --target opencv_world --config Debug

echo.
pause

%~dp0

当前 batch 文件的路径。

cmake -B build

配置阶段,会在当前目录下生成 build 文件夹,并在其中生成一系列 cmake 缓存。-D 之类的配置正是在这个阶段进行的,不过由于缓存的机制,只有在第一次 -B 的时候 -D 等配置才会生效。
任何时候都可以通过删除 build/CMakeCache.txt 或整个 build 文件夹来删除缓存,以便重新运行 -B

CMAKE_CONFIGURATION_TYPES

指定多配置生成器(如 VS,XCode,Ninja)上可用的构建类型,常见有 Debug, Release, RelWithDebInfoMinSizeRel
相对于用于指定单配置生成器的构建类型的 CMAKE_BUILD_TYPE

cmake --build build

会使用 build 目录下的 CMake 缓存编译目标文件。

–target

用于指定要编译的目标,默认则编译所有目标。

–config

用于指定多配置生成器要编译的构建类型,对于单配置生成器会忽略该选项。

MSBuild

MSBuild 命令行参考
常用的 MSBuild 项目属性

在 windows 中调用 MSBuild 编译现成的 .sln。

1
2
3
4
5
6
7
8
9
10
11
rem Find MSBuild by vswhere
set "VSWHERE_PATH=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
for /f "usebackq tokens=*" %%i in (`"%VSWHERE_PATH%" -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe`) do (
set "MSBUILD_PATH=%%i"
goto :exitLoop
)
:exitLoop
echo Found MSBuild at: %MSBUILD_PATH%

"%MSBUILD_PATH%" "%OPENCV_PATH%\build\OpenCV.sln" -p:Configuration=Debug;Platform=x64
"%MSBUILD_PATH%" "%OPENCV_PATH%\build\OpenCV.sln" -p:Configuration=Release;Platform=x64

vswhere

vswhere Find MSBuild
一个用于查找 Visual Studio 相关路径的软件,当安装 2017 或更高的 VS 版本时,vswhere 会被安装到 %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe

-p

p:name=value,设置或重写指定项目级属性,多个属性之间用分号或逗号分隔。

PS: 我尝试过通过 -p:RuntimeLibrary=MultiThreaded 重写 /MT 选项,没有生效,网上信息也比较少。
https://stackoverflow.com/questions/38109726/how-to-set-runtime-library-mt-md-configuration-in-msbuild