如何使用CMake的ProcessorCount实现高效并行构建?
解决方案:CMake 3.22 原生设置并行构建数(逻辑核心-1/物理核心)
针对你在CMake 3.22版本下的需求,以下是几种无需额外脚本、完全依赖CMake原生功能的实现方式:
方法1:通过configure_file生成带动态jobs数的CMakePresets.json
利用CMakeLists.txt的计算能力生成预设文件,解决CMakePresets.json不支持变量运算的问题:
在CMakeLists.txt中计算并行数
# 方案A:逻辑核心数-1(最低保留1个) ProcessorCount(LOGICAL_CORES) math(EXPR PARALLEL_JOBS "${LOGICAL_CORES} - 1") if(PARALLEL_JOBS LESS 1) set(PARALLEL_JOBS 1) endif() # 方案B:使用物理核心数(按需切换) # cmake_host_system_information(RESULT PHYSICAL_CORES QUERY NUMBER_OF_PHYSICAL_CORES) # set(PARALLEL_JOBS ${PHYSICAL_CORES})创建CMakePresets模板文件
在项目根目录新建CMakePresets.template.json,用占位符标记jobs位置:{ "version": 3, "configurePresets": [ { "name": "default", "generator": "Ninja", "binaryDir": "${sourceDir}/build" } ], "buildPresets": [ { "name": "default", "configurePreset": "default", "jobs": @PARALLEL_JOBS@ } ] }在CMakeLists.txt中生成最终预设文件
configure_file( ${CMAKE_SOURCE_DIR}/CMakePresets.template.json ${CMAKE_SOURCE_DIR}/CMakePresets.json @ONLY )- 第一次运行时,先执行基础配置命令(如
cmake -S . -B build)生成预设文件;后续直接用cmake --build --preset default即可自动使用计算好的并行数。
- 第一次运行时,先执行基础配置命令(如
方法2:自定义快速构建目标
直接在CMakeLists中定义一个带并行参数的构建目标,无需预设文件:
# 先计算并行数(同方法1的代码) ProcessorCount(LOGICAL_CORES) math(EXPR PARALLEL_JOBS "${LOGICAL_CORES} - 1") if(PARALLEL_JOBS LESS 1) set(PARALLEL_JOBS 1) endif() # 添加自定义快速构建目标 add_custom_target(fast_build COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} -j ${PARALLEL_JOBS} DEPENDS all COMMENT "Building with ${PARALLEL_JOBS} parallel jobs" )
使用方式:执行cmake --build build --target fast_build,即可自动按计算好的并行数构建。
方法3:修改默认构建命令参数
通过修改CMAKE_BUILD_COMMAND变量,让默认的构建命令自动带上并行参数:
# 计算并行数(同方法1) ProcessorCount(LOGICAL_CORES) math(EXPR PARALLEL_JOBS "${LOGICAL_CORES} - 1") if(PARALLEL_JOBS LESS 1) set(PARALLEL_JOBS 1) endif() # 仅对支持-j参数的生成器生效(如Ninja、Makefiles) if(CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR MATCHES "Makefiles") set(CMAKE_BUILD_COMMAND "${CMAKE_BUILD_COMMAND} -j ${PARALLEL_JOBS}") endif()
使用方式:正常执行cmake --build build即可,命令会自动附加-j X参数。
内容的提问来源于stack exchange,提问作者Zsar
相关产品推荐
相关产品推荐

