如何在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
相关产品推荐
相关产品推荐

