当前位置: 首页 > 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是个成员变量,但自己的初衷是发送一个最开始捕获的值,那么可以使用下面的方法…...

C C++ 如何编写库级接口

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

安装TDengine数据库3.3版本和TDengine数据库可视化管理工具

安装TDengine数据库3.3版本和TDengine数据库可视化管理工具 一、下载安装包二、解压安装包三、部署四、启动服务五、进入数据库六、创建数据库、表和往表中插入数据七、测试 TDengine 性能八、使用数据库九、查询数据十、TDengine数据库可视化界面 一、下载安装包 TDengine-cl…...

详解CAS

一、CAS是什么? CAS是Java中Unsafe类里面的一个方法,是Compare and Swap的缩写,中文翻译成比较并交换,主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性,实现并发算法时常用到的一种技术。它包含三…...

《环境感知方案:探索未来智能世界的关键技术》

《环境感知方案:探索未来智能世界的关键技术》 一、环境感知方案的研究现状(一)机器人领域的环境感知(二)农业领域的环境感知(三)智能网联汽车领域的环境感知 二、先进的环境感知技术&#xff0…...

Android 编译时出现Android resource linking failed.without required default value.

错误信息如下: Execution failed for task :app:processDebugResources. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction> Android resource linking failedwarn: removing r…...

golang ws升级为wss

首先需要一份openssl证书 1.安装openssl windows安装openssl 的下载地址在 https://slproweb.com/products/Win32OpenSSL.html 无脑点安装就行,记得最后安装完成的页面取消勾选 安装完成后记得配置环境变量 2.生成证书 openssl req -x509 -days 36500 -nodes …...

FFMPEG录屏(17)--- 使用 DwmRegisterThumbnail 捕获指定窗口图像数据

使用 DwmRegisterThumbnail 捕获指定窗口图像数据 在 Windows 平台上,捕获指定窗口的图像数据可以通过多种方法实现,其中一种高效的方法是使用 [DwmRegisterThumbnail] 本文将介绍如何使用 [DwmRegisterThumbnail] 捕获窗口图像数据,并提供一…...

点亮一个LED(51)

目录 1.LED介绍 2.硬件电路 3.程序设计 3.1.点亮一颗LED 3.2.LED闪烁 3.3.LED流水灯实现 1.LED介绍 发光二极管也具有二极管普遍的特性单向导电性,有阳极和阴极之分 ,上图左侧式插件式LED ,长的引脚是阳极;左侧是贴片式的带…...

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后,下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口,元素可以被分发到一个或多个窗口中,Flink 内置了常用的窗口分配器,包括:tumbling wi…...

【Tinymce】富文本编辑器在vue项目中的使用;引入付费格式刷,上传视频、图片

引言 富文本编辑器有很多,对比了一下,还是决定用tinymce(号称宇宙最强),基础的插件确实好用,但是一些更好用的插件,比如格式刷等都是高级版(付费),当然也有人…...