You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CMakeLists.txt中向MSBuild.exe传递参数及--的作用解析

CMake项目中为MSBuild设置并行构建参数及--的作用解释

问题描述

我有一个CMake项目,在Windows 10系统上使用MSVC 2019生成器。目前可通过以下命令成功构建项目:

cmake -S . -B build
cd build
cmake --build . -- /m

我希望在CMakeLists.txt文件内部将/m参数传递给msbuild.exe。尝试过以下代码但未成功,参数被传递给了cl.exe:

if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /m")
    message(STATUS "NOTICE: Setting parallel build for msbuild.exe")
    add_definitions(/M)
endif()

额外问题:上述最后一条CMake命令中的--是如何工作的?我难以找到相关文档说明。

解决方案

1. 正确将/m传递给MSBuild

你之前的错误在于把/m加到了编译器参数中(CMAKE_CXX_FLAGS和add_definitions都是配置cl.exe的选项),而/m是MSBuild的构建参数,需要直接传递给MSBuild进程。

有两种推荐方式实现:

方式一:设置CMAKE_MSBUILD_FLAGS

直接给MSBuild添加全局参数,在CMakeLists.txt中添加:

if(MSVC)
    set(CMAKE_MSBUILD_FLAGS "${CMAKE_MSBUILD_FLAGS} /m")
    message(STATUS "NOTICE: Setting parallel build for msbuild.exe")
endif()

这个变量会将参数直接传递给MSBuild,确保/m被用来启用并行构建。

方式二:使用CMAKE_BUILD_PARALLEL_LEVEL(更通用)

这是CMake提供的跨生成器通用变量,用于控制并行构建的线程数。设置后CMake会自动将对应的并行参数传递给底层构建工具(MSBuild、Ninja等):

# 设置为CPU核心数,或指定具体数值(比如8)
set(CMAKE_BUILD_PARALLEL_LEVEL $ENV{NUMBER_OF_PROCESSORS})

如果设置为$ENV{NUMBER_OF_PROCESSORS},效果和MSBuild的/m一致(使用所有可用核心)。

2. --在cmake --build中的作用

--是参数分隔符,用于区分CMake自身的命令参数和需要传递给底层构建工具(比如MSBuild、GNU Make)的参数。

  • --之前的参数由CMake解析处理(比如.指定构建目录);
  • --之后的所有参数会被原封不动地传递给底层构建工具,不会被CMake解析。

在你的命令中,/m就是通过--直接传递给MSBuild,让它启用并行构建。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:55:17