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

如何使用CMake的ProcessorCount实现高效并行构建?

解决方案:CMake 3.22 原生设置并行构建数(逻辑核心-1/物理核心)

针对你在CMake 3.22版本下的需求,以下是几种无需额外脚本、完全依赖CMake原生功能的实现方式:

方法1:通过configure_file生成带动态jobs数的CMakePresets.json

利用CMakeLists.txt的计算能力生成预设文件,解决CMakePresets.json不支持变量运算的问题:

  1. 在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})
    
  2. 创建CMakePresets模板文件
    在项目根目录新建CMakePresets.template.json,用占位符标记jobs位置:

    {
      "version": 3,
      "configurePresets": [
        {
          "name": "default",
          "generator": "Ninja",
          "binaryDir": "${sourceDir}/build"
        }
      ],
      "buildPresets": [
        {
          "name": "default",
          "configurePreset": "default",
          "jobs": @PARALLEL_JOBS@
        }
      ]
    }
    
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 22:46:03