CMake构建目标核心命令

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
      • 一、核心逻辑:围绕“目标(Target)”构建
      • 二、核心命令及职责详解
        • 1. 目标创建:`add_executable` / `add_library`
        • 2. 编译时依赖配置:`target_include_directories`
        • 3. 链接时路径配置:`target_link_directories`(可选,现代CMake中较少直接用)
        • 4. 链接时依赖配置:`target_link_libraries`(最核心的链接命令)
      • 三、完整流程总结(以“可执行文件依赖自定义库和第三方库”为例)
      • 四、现代CMake的关键原则

前言

一个cmake工程,最重要的是不是就是下面四个命令 add_library或者add_executable、
target_include_directories、 target_link_directories、
target_link_libraries add_library或者add_executable生成目标,即动态库或者可执行文件
target_include_directories为目标设置头文件路径
target_link_directories,如果有第三方库,要制定第三方库路径
target_link_libraries链接目标所使用的库 是不是就是这么个流程,你再详细总结归纳下


你提到的这几个命令确实是CMake工程中构建目标(库/可执行文件)的核心,但理解它们的“作用逻辑”和“现代CMake最佳实践”能让你更清晰地掌握工程构建流程。下面从“目标生命周期”和“核心命令职责”两方面详细归纳:

一、核心逻辑:围绕“目标(Target)”构建

CMake的核心思想是“目标导向”——所有操作都围绕“目标”(可执行文件、库)展开。一个目标从创建到完成构建,大致分为3个阶段,对应你提到的命令及扩展逻辑:

二、核心命令及职责详解

1. 目标创建:add_executable/add_library

作用:定义一个“目标”(可执行文件或库),是后续所有配置的基础。

  • add_executable(<目标名> [源文件列表]):生成可执行文件(如add_executable(myapp main.cpp))。
  • add_library(<目标名> [库类型] [源文件列表]):生成库文件,其中“库类型”包括:
    • STATIC:静态库(.a/.lib,编译时嵌入可执行文件);
    • SHARED:动态库(.so/.dll,运行时加载);
    • OBJECT:对象库(仅编译源文件为目标文件,不链接,用于后续复用)。

注意:目标名是CMake内部标识,后续所有target_*命令都通过这个名字关联目标。

2. 编译时依赖配置:target_include_directories

作用:指定目标编译时需要的头文件搜索路径(解决#include找不到文件的问题)。

  • 语法:target_include_directories(<目标名> [范围] [路径列表])
  • 关键:[范围]决定路径是否传递给“依赖该目标的其他目标”:
    • PRIVATE:仅当前目标使用(路径不传递给依赖者);
    • PUBLIC:当前目标使用,且传递给依赖者(例如:库A的头文件包含了库B的头文件,A对B的路径需设为PUBLIC);
    • INTERFACE:当前目标不使用,但传递给依赖者(通常用于“仅提供头文件的库”)。

示例

add_library(mylib src/lib.cpp) # mylib自己需要include目录,且依赖mylib的目标也需要(比如mylib的头文件里用了这里的头文件) target_include_directories(mylib PUBLIC include)
3. 链接时路径配置:target_link_directories(可选,现代CMake中较少直接用)

作用:指定目标链接时搜索库文件(.so/.a/.lib等)的路径。

  • 语法:target_link_directories(<目标名> [范围] [路径列表])
  • 注意:现代CMake更推荐“通过目标链接”(见下一条),而非直接指定路径。只有当第三方库没有提供CMake目标(即无法通过find_package找到)时,才需要手动指定链接路径。
4. 链接时依赖配置:target_link_libraries(最核心的链接命令)

作用:指定目标需要链接的库(包括自己工程的库、第三方库),并自动传递依赖关系(关键!)。

  • 语法:target_link_libraries(<目标名> [范围] [库列表])
  • 核心优势:如果链接的是“CMake目标”(而非原始库文件名),则会自动继承该目标的:
    • 头文件路径(通过target_include_directories设置的);
    • 编译选项(通过target_compile_options设置的);
    • 其他链接依赖(递归传递)。

示例

# 自己的库 add_library(mylib src/lib.cpp) target_include_directories(mylib PUBLIC include) # 可执行文件链接自己的库 add_executable(myapp src/main.cpp) # 链接mylib目标:myapp会自动获得mylib的PUBLIC头文件路径 target_link_libraries(myapp PRIVATE mylib) # 链接第三方库(如通过find_package找到的Boost) find_package(Boost REQUIRED) target_link_libraries(myapp PRIVATE Boost::Boost) # 自动继承Boost的头文件和链接路径

三、完整流程总结(以“可执行文件依赖自定义库和第三方库”为例)

  1. 创建目标:先定义库和可执行文件(顺序无关,但通常先库后可执行文件)。

    add_library(mylib STATIC src/lib.cpp) # 自定义静态库 add_executable(myapp src/main.cpp) # 可执行文件
  2. 配置编译依赖:给库设置头文件路径(如果可执行文件依赖库,库的路径设为PUBLIC则可执行文件自动继承)。

    target_include_directories(mylib PUBLIC include) # mylib的头文件在include目录
  3. 配置链接依赖:可执行文件链接自定义库和第三方库(优先用目标链接,少用路径)。

    # 链接自定义库 target_link_libraries(myapp PRIVATE mylib) # 链接第三方库(假设第三方库已通过find_package找到目标ThirdParty::lib) target_link_libraries(myapp PRIVATE ThirdParty::lib)

四、现代CMake的关键原则

  • 优先用“目标”(如mylibThirdParty::lib)而非“原始路径/文件名”(如-L/path -llib),减少硬编码,依赖关系自动传递。
  • 避免使用全局命令(如include_directorieslink_directories),改用target_*命令(作用域更清晰,仅影响指定目标)。

掌握这些,就能应对绝大多数CMake工程的核心构建需求了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1137237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qwen2.5-7B决策支持:商业分析辅助系统搭建

Qwen2.5-7B决策支持&#xff1a;商业分析辅助系统搭建 1. 引言&#xff1a;大模型驱动的智能商业分析新范式 1.1 商业分析的智能化转型需求 在当前数据驱动的商业环境中&#xff0c;企业对快速、精准、可解释的决策支持系统需求日益增长。传统的BI工具虽然能提供可视化报表&…

Qwen2.5-7B智能搜索:语义理解增强引擎实现

Qwen2.5-7B智能搜索&#xff1a;语义理解增强引擎实现 1. 技术背景与问题提出 随着大语言模型在自然语言处理领域的广泛应用&#xff0c;传统关键词匹配的搜索引擎已难以满足用户对精准语义理解和上下文感知能力的需求。尤其是在复杂查询、多轮对话、结构化数据解析等场景下&…

CMake链接配置为何不用链接路径

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言核心原因&#xff1a;CMake的“目标&#xff08;target&#xff09;”是元数据容器1. add_library(mylib src/lib.cpp) 做了什么&#xff1f;2. target_link_lib…

无感FOC在电机控制器中的实现难点解析:系统学习

无感FOC的实战困局&#xff1a;从理论到落地&#xff0c;如何跨越电机控制的“死亡谷”&#xff1f;你有没有遇到过这样的场景&#xff1f;一款新设计的风机&#xff0c;在实验室里运行丝滑如德芙巧克力&#xff0c;转速平稳、噪音极低。可一拿到客户现场——高温、高湿、带载启…

SpringBoot+Vue 飘香水果购物网站管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着互联网技术的快速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。水果作为高频消费品&#xff0c;其线上销售市场潜力巨大&#xff0c;但传统的水果销售模式存在信息不透明、供应链效率低等问题。基于此&#xff0c;开发一个高效、便捷的水果购物网站…

Qwen2.5-7B保姆级教程:4090D四卡配置详解

Qwen2.5-7B保姆级教程&#xff1a;4090D四卡配置详解 1. 背景与技术定位 1.1 Qwen2.5-7B 模型简介 Qwen2.5 是阿里云最新发布的大型语言模型系列&#xff0c;覆盖从 0.5B 到 720B 参数的多个版本。其中 Qwen2.5-7B 是一个中等规模、高性价比的通用大语言模型&#xff0c;适用…

usblyzer监控USB通信时序:超详细版图解说明

深入USB调试核心&#xff1a;用 usblyzer 看清通信时序的每一微秒你有没有遇到过这样的场景&#xff1f;设备插上电脑&#xff0c;系统提示“无法识别的USB设备”&#xff1b;或者明明代码逻辑没问题&#xff0c;数据却总是丢包、延迟高得离谱。这时候&#xff0c;打印日志没输…

救命!终于找对了!2026 黑客入门指南:从 Python 到 CTF 实战,超详细步骤,小白也能冲!

2026入门黑客的正确姿势&#xff0c;从零基础入门到精通&#xff08;超详细&#xff09;&#xff0c;看这一篇就够了&#xff01; 前言 首先要明白啊&#xff0c;我们现在说的黑客不是那种窃取别人信息、攻击别人系统的黑客&#xff0c;说的是调试和分析计算机安全系统的网络…

Qwen2.5-7B后训练技巧:提升模型精度的关键步骤

Qwen2.5-7B后训练技巧&#xff1a;提升模型精度的关键步骤 1. 引言&#xff1a;为何后训练是提升Qwen2.5-7B性能的核心环节 1.1 大模型能力边界的再定义 随着大语言模型从“通用预训练”向“任务适配”演进&#xff0c;后训练&#xff08;Post-Training&#xff09; 已成为决…

Elasticsearch下载与JVM调优配置深度剖析

从零构建高性能 Elasticsearch 集群&#xff1a;下载部署与 JVM 调优实战指南 你有没有遇到过这样的场景&#xff1f; 刚搭建好的 Elasticsearch 集群&#xff0c;在导入几千万条日志后&#xff0c;查询响应越来越慢&#xff1b;某个节点突然“失联”&#xff0c;查看日志才发…

【std::map】与QMap差异

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、基础介绍1. std::map&#xff08;C标准库&#xff09;2. QMap&#xff08;Qt框架&#xff09;二、核心差异对比代码示例&#xff1a;直观感受差异三、使用场景建…

【std::unordered_map】VS显示双向迭代器探究

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、核心结论&#xff1a;标准 vs MSVC的实现二、关键验证&#xff1a;MSVC下unordered_map迭代器的--操作真的通用吗&#xff1f;不同VS版本的结果&#xff1a;三、…

CMake几个命令顺序

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录关键顺序规则&#xff1a;示例说明顺序解释&#xff1a;错误顺序的后果&#xff1a;在 CMake 中&#xff0c;target_include_directories、target_link_directories、…

佳能主流打印机型号万能清零工具:原理与使用详解【P07/5B00解决方案指南】

佳能打印机万能清零工具&#xff1a;原理与使用详解【P07/5B00解决方案指南】 引言 在日常使用打印机的过程中&#xff0c;我们经常会遇到各种报错问题&#xff0c;如"P07/5B00"等。这些错误通常是由于打印机内部计数器达到预设值导致的&#xff0c;而非硬件故障。…

vTaskDelay在工业控制中的延时机制深度剖析

vTaskDelay在工业控制中的延时机制深度剖析&#xff1a;不只是“等一会儿”那么简单你有没有遇到过这样的情况&#xff1f;在一个电机控制任务里&#xff0c;明明写了vTaskDelay(10)想每10ms采样一次电流&#xff0c;结果发现实际周期越来越长&#xff0c;甚至偶尔跳变成30ms&a…

CMake工程是否引用三方库的头文件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言具体规则&#xff1a;示例说明特殊情况&#xff1a;通过 find_package 引入的第三方库总结前言 myapp工程需要链接额外的第三方库的情况下&#xff0c;连接前需…

边沿触发D触发器电路图通俗解释:建立与保持时间分析

边沿触发D触发器&#xff1a;从电路图到建立与保持时间的实战解析你有没有遇到过这样的情况&#xff1f;明明逻辑写得没错&#xff0c;仿真也通过了&#xff0c;可烧进FPGA后系统却时不时“抽风”——数据错乱、状态跳变&#xff0c;甚至直接死机。排查半天&#xff0c;最后发现…

PCAN驱动开发常见问题快速理解与解决

PCAN驱动开发避坑指南&#xff1a;从初始化失败到高频丢包的实战解析 你有没有遇到过这样的场景&#xff1f; 设备插上了&#xff0c;驱动也装了&#xff0c;可 CAN_Initialize() 就是返回 PCAN_ERROR_UNKNOWN &#xff1b; 程序跑着跑着突然开始“丢帧”&#xff0c;日…

CMake成果打包

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、基础必备文件&#xff08;开发阶段&#xff09;二、如果 mylib 本身依赖其他库&#xff0c;是否需要额外打包&#xff1f;1. 依赖“静态库”&#xff08;.a/…

高校电工实验中Multisim元器件图标的教学实践指南

高校电工实验中&#xff0c;如何教学生“看懂”Multisim里的那些小图标&#xff1f;你有没有遇到过这样的场景&#xff1a;一堂《电路分析》实验课上&#xff0c;老师刚讲完共射放大电路的原理。学生们打开Multisim准备仿真&#xff0c;结果有人把电解电容接反了极性&#xff0…