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

如何让CMake仅为项目的部分目标生成配置?

解决方法

1. 用CMake选项控制目标/子目录的启用

在根CMakeLists.txt中为需要控制的目标或子目录添加开关选项,通过条件判断决定是否加载对应内容:

# 定义开关,默认开启所有目标,可按需修改默认值
option(BUILD_APP_A "Build Application A" ON)
option(BUILD_LIB_B "Build Library B" ON)
option(BUILD_SUBDIR_C "Build Subdirectory C" ON)

# 仅当对应开关开启时,才添加目标或子目录
if(BUILD_APP_A)
    add_executable(app_a src/app_a.cpp)
endif()

if(BUILD_LIB_B)
    add_library(lib_b src/lib_b.cpp)
endif()

if(BUILD_SUBDIR_C)
    add_subdirectory(subdir_c)
endif()

配置时,通过命令行参数指定要关闭的选项,比如仅构建app_a:

cmake -S . -B build -DBUILD_LIB_B=OFF -DBUILD_SUBDIR_C=OFF

这种方式下,CMake在配置阶段只会处理启用的目标,不会生成其他目标的构建规则。

2. 用CMake Presets批量管理目标组合

如果需要频繁切换不同的目标集合,可以通过CMakePresets.json预设配置:

{
  "version": 3,
  "configurePresets": [
    {
      "name": "only-app-a",
      "displayName": "仅构建Application A",
      "binaryDir": "${sourceDir}/build-only-app-a",
      "cacheVariables": {
        "BUILD_APP_A": "ON",
        "BUILD_LIB_B": "OFF",
        "BUILD_SUBDIR_C": "OFF"
      }
    },
    {
      "name": "full-build",
      "displayName": "构建所有目标",
      "binaryDir": "${sourceDir}/build-full",
      "cacheVariables": {
        "BUILD_APP_A": "ON",
        "BUILD_LIB_B": "ON",
        "BUILD_SUBDIR_C": "ON"
      }
    }
  ]
}

使用时直接指定预设名称即可:

cmake --preset only-app-a

关键注意点

  • EXCLUDE_FROM_ALL属性仅控制目标是否默认参与全量编译(比如make默认不编译它,需手动指定make target),但CMake仍会在配置阶段生成该目标的构建规则,无法满足“仅生成部分目标配置”的需求。
  • 自定义目标(add_custom_target)只是编译阶段的触发逻辑,不会影响配置阶段对所有目标的处理,这也是你之前尝试无效的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:22:47