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

