当前位置: 首页 > news >正文

target_include_directories是如何组织头文件的?

target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 这条 CMake 命令用于指定编译目标(在此例中为 mylib 静态库)的头文件搜索路径。具体来说,这条命令的作用包括以下几个方面:

1. 添加包含目录

  • mylib:这是目标名称,即你要为其设置包含目录的静态库。
  • PUBLIC:这是访问说明符,表示包含目录的作用范围。
  • ${CMAKE_CURRENT_SOURCE_DIR}:这是当前 CMakeLists.txt 文件所在的源代码目录路径,通常包含库的头文件。

2. 访问说明符的含义

CMake 提供了三种访问说明符:PRIVATEPUBLICINTERFACE,它们决定了包含目录对不同目标的影响范围。

  • PRIVATE

    • 只对当前目标(mylib)有效。
    • 链接到 mylib 的其他目标不会继承这些包含目录。
  • PUBLIC

    • 对当前目标和所有链接到该目标的其他目标都有效。
    • 这意味着使用 mylib 的可执行文件或其他库也会自动包含这些目录,以便找到必要的头文件。
  • INTERFACE

    • 只对链接到该目标的其他目标有效,当前目标自身不使用这些包含目录。

在你的命令中使用 PUBLIC,意味着不仅 mylib 本身在编译时会使用 ${CMAKE_CURRENT_SOURCE_DIR} 作为头文件搜索路径,而且所有链接到 mylib 的目标(如可执行文件 app)也会自动使用这个包含目录。这对于库的使用者来说非常方便,因为他们不需要手动指定库的头文件路径。

3. 实际效果

假设你的项目结构如下:

project/
├── lib/
│   ├── mylib.cpp
│   └── mylib.h
├── app/
│   ├── main.cpp
└── CMakeLists.txt
  • lib/CMakeLists.txt 中的命令:

    add_library(mylib STATIC mylib.cpp)
    target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    
  • app/CMakeLists.txt 中的命令:

    add_executable(app main.cpp)
    target_link_libraries(app PRIVATE mylib)
    

在这种设置下:

  1. 编译 mylib

    • 编译器会在 ${CMAKE_CURRENT_SOURCE_DIR}(即 lib/ 目录)中查找头文件,例如 mylib.h
  2. 编译 app

    • 因为 app 链接了 mylibmylib 的包含目录是 PUBLIC,所以 app 的编译器也会自动将 lib/ 目录添加到头文件搜索路径中。
    • 这样,app/main.cpp 中包含 #include "mylib.h" 时,编译器能够正确找到 mylib.h

4. 为什么使用 CMAKE_CURRENT_SOURCE_DIR

  • CMAKE_CURRENT_SOURCE_DIR
    • 这个变量指向当前 CMakeLists.txt 文件所在的源代码目录。
    • lib/CMakeLists.txt 中,它指向 project/lib/,确保包含目录指向包含 mylib.h 的正确路径。

使用 CMAKE_CURRENT_SOURCE_DIR 而不是相对路径或其他路径变量,可以提高 CMakeLists.txt 的可维护性和可移植性,避免在项目结构变化时出现路径错误。

5. 总结

target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 的主要作用是:

  • mylib 指定头文件搜索路径:确保在编译 mylib 时能够找到必要的头文件。
  • 为依赖 mylib 的目标自动添加头文件路径:使用 PUBLIC 关键字,使得所有链接 mylib 的目标(如可执行文件或其他库)也能自动包含这些目录,简化依赖管理。

这种方式符合现代 CMake 的最佳实践,通过清晰地指定目标的接口属性(如包含目录),使项目结构更加模块化和易于维护。

相关文章:

target_include_directories是如何组织头文件的?

target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 这条 CMake 命令用于指定编译目标(在此例中为 mylib 静态库)的头文件搜索路径。具体来说,这条命令的作用包括以下几个方面: 1. 添加包含目录 mylib&…...

【Flutter】Dart:运算符

在 Dart 中,运算符是非常重要的组成部分,它们可以对变量和常量进行多种运算操作。理解和掌握 Dart 中的各种运算符不仅可以帮助你编写更加高效、简洁的代码,还能更好地理解其背后的逻辑和设计。本文将深入探讨 Dart 中的运算符,包…...

ChatGPT01-preivew体验报告:内置思维链和多个llm组合出的COT有啥区别呢?丹田与练气+中学生物理奥赛题测试,名不虚传还是名副其实?

一个月前,o1发布的时候,我写了篇文章介绍 逻辑推理能力堪比博士生,OpenAI发布全新AI模型系列: o1 - 大模型或许进入新阶段,还翻译了官方的介绍 解密OpenAI o1是如何让LLMs获得逻辑推理能力的 - CoT * RL,也…...

《云计算网络技术与应用》实训6-1:配置KVM虚拟机使用NAT网络

任务1、计算节点基础环境准备 1. 使用VMware安装CentOS 7虚拟机,安装时记得开启CPU虚拟化,命名为“KVMC6”。 2. (网卡配置和之前的一样,都用100网段)网关设置为192.168.100.1,地址段为192.168.100.10-25…...

【Unity新闻】Unity 6 正式版发布

Unity CEO Matt Bromberg 在今天自豪地宣布,Unity 6 正式发布!作为迄今为止最强大和稳定的版本,Unity 6 为游戏和应用开发者提供了大量的新功能和工具,帮助他们加速开发并提升性能。 本次正式版是6.0000.0.23f1(LTS&a…...

基于语音识别的停车共享小程序(lw+演示+源码+运行)

目 录 1 绪论1 1.1 课题研究背景1 1.2 研究现状1 1.3 论文结构安排1 2 系统关键技术2 2.1 微信小程序2 2.2 微信Web开发者工具2 2.3 JavaScript简介2 2.4 微信小程序API接口2 2.5 MYSQL数据库2 3 系统分析1 3.1 可行性分析1 3.1.1 技术可行性1 3.1.2 经济可行性1…...

编程考古-计算机发展(上)

计算机/器现在是我们日常生活中的重要工具,它的发展历程见证了人类数学计算能力的不断提升。 什么是计算 计算的本质在于基于规则对符号串进行变换。简言之,从一个初始的符号串(输入)出发,依据既定的法则逐步改变这个…...

pc轨迹回放制作

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:pc轨迹回放制作 主要内容:制作车辆轨迹操作页,包括查询条件、动态轨迹回放、车辆轨迹详情表单等 应用场景:车辆…...

无向图中的一些问题与处理(上接无向图知识简记)

一、有向图中的排序与调度 1、深度优先搜索的排序 使用深度优先搜索对图中顶点进行排序,根据数据结构性质与递归保存顺序,有以下三种排列顺序 (1) 前序:在递归调用之前将顶点加入队列。 (2)后…...

AIGC助力小学生编程梦:C++入门不再难!

文章目录 一、AIGC时代下的编程教育新趋势二、小学生C入门趣味编程的意义三、小学生C入门趣味编程的实践策略四、面临的挑战与应对策略五、AIGC技术在小学生C编程中的应用与前景《小学生C趣味编程从入门到精通》编辑推荐内容简介作者简介目录 随着人工智能生成内容(…...

AI开发-三方库-Hugging Face-Pipelines

1 需求 需求1:pipeline支持的任务类型 需求2:推理加速使用CPU还是GPU 需求3:基于pipeline的文本分类示例 需求4:pipeline实现原理 模型使用步骤(Raw text -》Input IDs -》Logits -》Predictions)&…...

【Python网络编程】学习Socket编程,打造网络应用!

【Python网络编程】学习Socket编程,打造网络应用! 网络编程是现代计算机科学中的重要一环,几乎所有的应用都依赖网络传输数据。无论是创建简单的客户端-服务器模型,还是构建复杂的网络应用,Socket 编程都是关键的技术…...

docker (desktopcompose) download

docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell...

即时通讯:单聊消息逻辑

在线消息(对方在线) 1.client发送消息到msg_server 2.msg_server判断消息有效性,每秒发送的消息不能超过限制,无误后转发给db_server 3.db_server判断为单聊 查找对应的会话,不存在则创建两个会话(双方…...

Libevent源码剖析之reactor

1 简介 reactor 是一种事件驱动的并发处理模式,常用于网络服务器和事件循环系统中。它主要的功能是通过单线程或者多线程处理I/O操作,避免阻塞,并且能够高效处理大量并发的事件。 one loop per thread or process,以下摘自 reacto…...

分享一套SpringBoot+Vue民宿(预约)系统

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue民宿(预约)系统,分享下嘿嘿。 项目介绍 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难&#xff0c…...

Linux——应用软件的生命周期

功能开发测试: 功能性测试 对应开发框架的测试用例代码的漏洞扫描 Web服务器版本应用开发语言的依赖关系和版本信息是否会造成类似内存泄露等影响系统性能的问题压力测试应用的部署 获取应用代码以及应用静态文件的代码包将安装包中的文件按照服务器配置的架构&…...

【Linux】exec系列函数详细介绍

首先,exec 是 execute (意为:执行) 的缩写。 exec系列函数 各个“后缀”的意思: l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp execl:l 为 list 可变参数列表 原型:int execl(const char *path, cons…...

ARINC 429总线协议

一、概述 ARINC 是美国航空无线电公司英文字头的缩写, 该公司1977年7月21日出版了“ARINC 429规范”一书,429规范就是飞机电子系统之间数字式数据传输的标准格式,在飞机上使用429总线的电子设备均应遵守这个规范,这样才能保证电子…...

Qt解决槽函数中发送的信号的参数会变化带来的错误

connect(item, &MusicItemWidget::playRequest, this, [this] { emit playMusic(QUrl(this->m_mediaPath); ); 如上图,this->m_mediaPath是个成员变量,但自己的初衷是发送一个最开始捕获的值,那么可以使用下面的方法…...

Arduino TFT库:寄存器级驱动与双芯片兼容设计

1. 项目概述TFT 库是一个专为 Arduino 平台设计的轻量级图形驱动库,核心目标是支持 Seeed Studio 推出的 2.8 英寸 TFT 触摸屏扩展板(v1.0 版本)。该硬件模块采用双芯片方案:显示控制器可选用 SPFD5408A 或 ST7781R 其中之一&…...

Laravel vs 主流PHP框架:终极对决

好的,我们来对比一下 Laravel 与其他一些主流 PHP 框架的特点和适用场景。这种对比通常涉及多个维度,包括易用性、性能、功能丰富度、社区支持等。以下是一个简要的对比表格,总结了 Laravel 与其他几个常见 PHP 框架(Symfony, Cod…...

别再让图片拖慢你的多模态模型了:手把手教你用Q-Former和PruMerge压缩视觉Token(附代码)

视觉Token压缩实战:用Q-Former和PruMerge提升多模态模型效率 当你在深夜调试一个多模态问答系统时,突然收到告警——GPU显存爆了。查看日志发现,一张用户上传的4K产品图片生成了超过3万个视觉Token,直接拖垮了整个推理流程。这不是…...

eNSP启动AR报错码40终极排查指南:从Hyper-V冲突到虚拟网卡修复

1. 遇到eNSP启动AR报错码40怎么办? 最近在折腾eNSP的时候,遇到了AR设备启动报错码40的问题,按照官方帮助手册排查了一圈都没解决。这种系统级的虚拟化冲突确实让人头疼,特别是当你急着做实验的时候。经过反复测试和查阅资料&#…...

轴向磁通电机仿真避坑指南:ANSYS Maxwell 3D建模时气隙与对称性的7个关键设置

轴向磁通电机3D仿真进阶指南:从参数校准到高效求解的实战技巧 轴向磁通电机因其紧凑结构和高效能特性,正在新能源车、航空航天等领域获得广泛应用。但不同于传统径向电机,其三维电磁场分布的复杂性使得仿真过程常成为工程师的"噩梦"…...

突破端侧极限!让 Gemma 4 在手机不仅能跑,还能“用中文张口说话” —— 安卓端侧大模型

2026 年 4 月初,Google 抛下了一枚重磅炸弹:Gemma 4 终于来了!更令人震撼的是,他们真的把多模态大模型完完整整塞进了手机里 —— 这一次,完全不需要联网、不需要传数据到云端,真正的零延迟隐私拉满的端侧离…...

CET中电技术如何助光伏企业在“四可“时代抢占先机?

2026年,"十五五"规划开局之年,新能源行业正经历一场深刻的变革。从2025年5月30日136号文推动投资主体转变,到2026年1月30日114号文将"四可"能力从试点推广期正式升级为政策强制标准,分布式光伏的并网逻辑已被…...

仅限PHP 8.9+可用!5个颠覆认知的类型优化技巧(含OPcache预编译类型缓存调优参数)

第一章:PHP 8.9类型系统演进全景图PHP 8.9尚未正式发布(截至2024年,PHP最新稳定版为8.3),但作为社区广泛讨论的“假想演进版本”,它被用作技术前瞻的思维实验载体——聚焦于类型系统在静态分析、运行时安全…...

DolphinScheduler 3.x 用户看过来:一个技巧,让你所有工作流自动继承“公司级”公共变量

DolphinScheduler 3.x企业级变量治理:打造零配置的智能工作流引擎 在数据团队协作中,变量管理就像空气——平时感觉不到它的存在,一旦缺失却寸步难行。想象这样的场景:财务部门突然要求所有报表改用新的财年起始日,开发…...

【AI知识点】NP-Hard问题:从理论到实践的复杂性迷宫

1. 走进NP-Hard问题的复杂性迷宫 想象你站在一个巨大的迷宫入口,手里只有一张模糊的地图。每走几步就会遇到分叉路口,每个选择都可能让你离出口更近或更远——这就是NP-Hard问题给我的第一印象。作为计算复杂性理论中的"终极大Boss"&#xff0…...