当前位置:首页 > 文章列表 > 文章 > 软件教程 > CMake 怎么只构建指定 target

CMake 怎么只构建指定 target

来源:17golang原创 2026-10-13 06:51:56 0浏览 收藏

如果项目已经生成过 CMake 构建目录,想只编译其中一个库或可执行文件,核心命令就是 cmake --build --target 。--target 会把构建目标从默认目标切换成指定目标;目标自身需要的依赖仍可能一起构建,但没有被选中的无关目标不会因为这次命令自动加入。

官方地址:https://cmake.org/cmake/help/latest/manual/cmake.1.html

本文按一个常见场景推进:项目里同时有 core_lib、app_cli 和 docs,开发者只想快速重编 app_cli。重点是已生成的 build 目录和目标选择,不展开生成器配置。

最小可用写法是 cmake --build build --target app_cli;需要加速时再追加 --parallel 8,多配置生成器则补上 --config Release。

准备已经生成的构建目录

--target 属于构建阶段选项,前提是 build 已经由 CMake 配置并生成过。它不会替代 cmake -S ... -B ... 的配置步骤,也不会改变项目里声明的目标依赖关系。把两个阶段分开,后面排查“目标不存在”和“配置没有更新”会更容易。

先确认当前目录下确实有项目的构建目录;如果项目习惯使用 out/build、cmake-build-debug 等名字,就把命令里的目录替换为实际路径。这里不需要进入构建目录,--build 后面直接传它即可。

# 第一次配置项目时生成构建树;已有可用 build 目录时不要重复执行
cmake -S . -B build

# 构建阶段直接指定已有的二进制目录
cmake --build build

如果刚修改了 CMakeLists.txt、工具链或缓存选项,先按项目流程重新配置,再选择目标。本文后面的命令都假定构建树已经可用。

从构建目录选择要构建的 target

把目标名当成构建任务的最小单位:库可以是 core_lib,可执行文件可以是 app_cli,也可以是项目自定义的 docs 或其他 target。名称必须与项目生成的目标名完全一致,不能把源文件名、输出文件名或目录名当成目标名。

下面这张原创界面说明图用静态工作台展示目标列表与命令预览,帮助对照“选中的目标”和命令里的 --target 值;它不是 CMake 或 IDE 的真实截图,也不是运行证据。

原创界面说明图展示已配置构建目录、CMake目标列表和target命令预览
图1:界面说明图,查看构建目录中目标列表与 --target 命令的对应关系。

如果只想构建命令行程序,最直接的写法如下:

# 只请求 app_cli 这个目标;它需要的依赖仍由构建系统按关系处理
cmake --build build --target app_cli

CMake 官方命令行文档将 --build

定义为已生成项目的二进制目录,将 --target ... 定义为替换默认目标;因此“只构建指定 target”不是切换源码目录,而是改变本次构建请求的目标集合。

提交目标构建并控制并行度

目标确认后再提交构建命令。对编译时间较长的目标,可以用 --parallel 或简写 -j 控制并发进程数;这只改变构建调度,不会把其他无关 target 加入构建请求。

# 用 8 个并行进程构建 app_cli,数值按机器资源调整
cmake --build build --target app_cli --parallel 8

# 同一次请求也可以列出多个明确目标,空格分隔
cmake --build build --target core_lib app_cli --parallel 8

如果依赖目标已经是最新状态,构建工具通常会跳过无需重建的部分;如果源码或生成文件发生变化,指定目标所依赖的受影响对象可能重新编译。这是增量构建的正常表现,不等于 CMake 忽略了 --target。

多配置生成器要补充构建配置

使用 Visual Studio、Xcode 等多配置生成器时,同一个构建目录里可能同时存在 Debug 和 Release。此时目标名仍然放在 --target 后面,但还要用 --config 明确这次要构建哪一种配置。

# 多配置构建目录中,只构建 Release 配置的 app_cli
cmake --build build --config Release --target app_cli

# 调试阶段改为 Debug;不要把配置名误写成 target 名
cmake --build build --config Debug --target app_cli

单配置生成器通常在配置阶段已经确定构建类型,命令里未必需要 --config。如果你不确定当前生成器属于哪一类,先查看项目约定或 CMake 配置输出,再决定是否补这个参数。

核对提交结果和依赖范围

提交后按三层结果核对。第一层看命令是否以成功状态结束;第二层看目标产物或目标对应的输出是否更新;第三层看输出中是否出现了必要依赖的构建,而不是大量无关目标。指定 target 不承诺“只执行一条编译命令”,它承诺的是以该目标为构建入口。

下面这张原创结果说明图展示了目标完成、必要依赖完成和未选目标保持未构建三种状态,图中的状态是帮助理解验收位置的静态示意,不代表某次真实运行结果。

原创结果说明图展示指定CMake目标、必要依赖和未选目标的状态
图2:结果说明图,查看指定 target、必要依赖和未选目标的状态区分。
核对位置预期观察异常时先看哪里
命令行退出状态命令正常结束目标名称、编译器错误和构建目录
构建输出出现目标及其必要依赖是否误用了默认目标或脚本封装
产物时间目标产物按需更新源码是否真的改变、增量条件是否满足
未选目标没有被无故触发是否存在自定义总目标或显式依赖链

常见问题和恢复路径

提示目标不存在:先确认传入的是 CMake target 名,不是文件名。目标可能由子目录声明,也可能只在某个生成条件成立时出现;需要回到项目配置和生成器输出确认。

指定了目标却编译了其他内容:先区分“必要依赖”和“无关目标”。目标依赖链中的库或生成步骤可以被一起执行;如果完全不相关的模块也被触发,再检查是否调用了封装脚本、总目标或自定义构建步骤。

修改后仍像旧代码:选择 target 只控制构建请求,不会自动替代重新配置。检查是否改动了会影响生成结果的 CMakeLists.txt、工具链或缓存变量;必要时重新生成构建树,再回到单目标命令。

Debug 和 Release 搞混:多配置生成器明确写 --config,并在产物路径或构建输出中核对配置名;单配置生成器则遵循配置阶段的构建类型。

相关问题

--target 能不能一次写多个目标?可以,按空格列出多个目标;如果只想处理一个目标,保持命令短一些更利于定位输出。

指定目标后为什么还会构建依赖库?因为依赖是目标可构建性的前置条件。选择 target 限定的是构建入口,不是删除依赖关系。

只构建目标和只安装目标是一回事吗?不是。--target 负责构建目标;安装属于另一阶段,是否安装以及安装哪些组件由项目的安装规则决定。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
特效变音魔术师适合什么年龄?内容分级、酒精提及与购买提示说明特效变音魔术师适合什么年龄?内容分级、酒精提及与购买提示说明
上一篇
特效变音魔术师适合什么年龄?内容分级、酒精提及与购买提示说明
CMake 安装到自定义目录为什么路径不对
下一篇
CMake 安装到自定义目录为什么路径不对
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    451次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    520次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    536次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    481次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    304次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码