CMake入门教程【核心篇】包含目录(include_directories)

在这里插入图片描述

😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「本专栏容」:CMake入门教程
😈「动动你的小手」点赞👍收藏⭐️评论📝


文章目录

    • 1. 基本用法
    • 2. 添加单个包含目录
    • 3. 添加多个包含目录
    • 4. 控制包含目录的搜索顺序
    • 5. 区分系统头文件和用户头文件
    • 6.使用技巧
      • 6.1 避免全局设置
      • 6.2 使用`target_include_directories`
      • 6.3 区分私有和公共包含目录
      • 6.4 管理第三方库的包含目录

CMake的 include_directories命令是用于指定头文件搜索路径的重要工具。在编译C++代码时,正确设置包含目录对于确保编译器能够找到所有必要的头文件至关重要。

include_directories 使用
添加单个包含目录
添加多个包含目录
控制搜索顺序
区分系统和用户头文件
使用技巧
include_directories(include)
include_directories(include1 include2)
include_directories(AFTER include1 BEFORE include2)
include_directories(SYSTEM system_include)
避免全局设置
使用target_include_directories
target_include_directories(my_target PRIVATE include)
区分私有和公共包含目录
target_include_directories(my_library PUBLIC include_public)
target_include_directories(my_library PRIVATE include_private)
管理第三方库包含目录
find_package(Boost REQUIRED)
target_include_directories(my_target PRIVATE \${Boost_INCLUDE_DIRS})

1. 基本用法

include_directories命令用于添加包含目录,其基本语法如下:

include_directories([AFTER|BEFORE] [SYSTEM] directory1 [directory2 ...])
  • directory1, directory2, … 是要添加的包含目录。

2. 添加单个包含目录

include_directories(include)
  • 这会将项目目录下的include目录添加到包含路径中。

3. 添加多个包含目录

include_directories(include1 include2)
  • 这会同时将include1include2目录添加到包含路径中。

4. 控制包含目录的搜索顺序

include_directories(AFTER include1 BEFORE include2)
  • 使用AFTERBEFORE关键字可以控制包含目录的搜索顺序。在此例中,include1会在include2之后被搜索。

5. 区分系统头文件和用户头文件

include_directories(SYSTEM system_include)
  • 使用SYSTEM参数可以将特定目录标记为系统头文件目录,这有助于减少编译器对于系统头文件的警告。

6.使用技巧

6.1 避免全局设置

尽可能避免在项目的根CMakeLists.txt中全局设置包含目录,以防止不同目标间的潜在冲突。

6.2 使用target_include_directories

在现代CMake中,推荐使用target_include_directories而不是include_directories

target_include_directories(my_target PRIVATE include)
  • 这将include目录添加到特定目标my_target的私有包含路径。

6.3 区分私有和公共包含目录

对于库目标,使用PRIVATEPUBLIC关键字区分私有和公共包含目录:

target_include_directories(my_library PUBLIC include_public)
target_include_directories(my_library PRIVATE include_private)
  • PUBLIC包含目录会被库的使用者继承,而PRIVATE包含目录仅用于库本身的构建。

6.4 管理第三方库的包含目录

使用find_packagepkg_check_modules来管理第三方库,并使用其提供的包含目录:

find_package(Boost REQUIRED)
target_include_directories(my_target PRIVATE ${Boost_INCLUDE_DIRS})
  • 这样可以确保第三方库的包含目录被正确添加。

通过这些方法,您可以有效地管理和优化CMake项目中的包含目录,确保构建系统的可维护性和可移植性。

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

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

相关文章

vue动态添加数据

1,先声明一个数组为响应式的,里面有一些数据 const tableData ref([{sex: 女,name: 姓名1,birthday:0512},{sex: 女,name: 姓名2,birthday:0314},{sex: 男,name: 姓名3,birthday:1012},{sex: 女,name: 姓名4,birthday:0915}, ]); 我这里用的是表格的,…

快手推荐算法工程师三面回顾

快手三次技术面试一次HR面试的简单回顾,希望对大家有所启发。 一面 面试官一上来就让写算法题,第一个是计算岛屿数量,第二个是最长回文字串。 然后就是介绍自己的论文。对于论文的工作,面试官只是在问关于论文的问题&#xff0…

【PCB专题】Allegro封装更新焊盘

在PCB封装的绘制中,有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢? 打开封装,选择Tools->Padstack->Refresh... 选择Refresh all …

CentOS快速安装Mysql5.7(Alibaba Cloud Linux兼容)

1、安装 在线下载 http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 下载rpm安装包 [roottheo bin]# cd /usr/local [roottheo local]# wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm安装rpm [roottheo local]# rpm -iv…

关于一个web站点的欢迎页面

- 什么是一个web站点的欢迎页面? - 对于一个webapp来说,我们是可以设置它的欢迎页面的。 - 设置了欢迎页面之后,当你访问这个webapp的时候,或者访问这个web站点的时候,没有指定任何“资源路径”,这个时候…

中国FinOps现状调查报告(2023)》亮点解读

今年以来,我们举办了多期FinOps的专题分享,邀请了美图、腾讯、B站、趣丸、知乎等厂商和行业专家,分享他们在FinOps领域的经验。我们也发现越来越多的人对FinOps产生了浓厚的兴趣,而且FinOps的成熟度也在逐渐提升。 降本增效&…

SpringSecurity结合knife4j实现swagger文档

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站…

关键字:instanceof关键字

在 Java 中,instanceof关键字用于检查一个对象是否是某个特定类或其子类的实例。它的语法如下: 其中,Object是要检查的对象,Class是要检查的类或接口。 instanceof关键字的返回值是一个布尔值,如果对象Object是类Cla…

Docker介绍、常用命令、项目部署

什么是Docker 简单说:Docker就是一个虚拟机,专业说:它是一个开源的容器平台。它和我们常用的VMware有很多相似的地方。 名词解释 镜像/images 由本体打包出来的文件。并不是文件本身,但是具有该文件的功能。举个不太贴切的例子&…

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(2)

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(2) 在 Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(1) Android Matrix剪切clipPath缩放scale图片po…

基于Java教师信息管理系统

基于Java的教师信息管理系统是一个用于管理教师信息的软件系统。该系统采用Java编程语言,利用JSP、Servlet等技术进行开发,并使用MySQL数据库进行数据存储和处理。 系统功能主要包括: 1、教师信息录入:管理员可以录入新教师信息…

LCR 174. 寻找二叉搜索树中的目标节点

解题思路: 二叉搜索树一般采用中序遍历(从小到大排列)。 class Solution {int res, cnt;public int findTargetNode(TreeNode root, int cnt) {this.cnt cnt;dfs(root);return res;}void dfs(TreeNode root) {if(root null) return;dfs(ro…

Docker 入门 ------容器互通以及Dockerfile

1. 端口映射以及容器互联 Docker 除了通过网络访问,还提供了两种很方便的功能来满足服务访问的基本需求: 允许映射容器内应用的服务端口到本地宿主主机互联机制实现多个容器间通过容器名来快速访问 1.1 容器映射实现访问容器 1.1.1 从外部访问容器应…

MYSQL语句 | find_in_set()

FIND_IN_SET() 是 MySQL 中的一个字符串函数,用于在逗号分隔的字符串列表中查找指定字符串的位置。 它的语法如下: FIND_IN_SET(search_string, string_list)search_string: 要搜索的字符串。string_list: 逗号分隔的字符串列表。 该函数返回一个整数…

回归和分类区别

回归任务(Regression): 特点: 输出是连续值,通常是实数。任务目标是预测或估计一个数值。典型应用包括房价预测、销售额预测、温度预测等。 目标: 最小化预测值与真实值之间的差异,通常使用…

Python 标准库中的 csv 包

0. Abstract 官方文档很罗嗦,长篇大论例子少。本文将举例说明 csv 包的用法,然后补充一些必要的说明。 1.0 CSV 文件 CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的以纯文本形式存储数据的文件格式。它使用逗号作为字段之间的分隔符&#…

解决docker容器内无法连接宿主redis

背景 小程序的发短信服务挂了,随查看日志,该报错日志如下 Error 111 connecting to 127.0.0.1:6379. Connection refused. 6379是监听redis服务的端口,那大概是redis出错了。 首先查看了redis是否正常启动,检查出服务正常。 由于小…

3.无重复字符的最长子串(滑动窗口,C解答)

题目描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb&quo…

Flappy Bird QDN PyTorch博客 - 代码解读

Flappy Bird QDN PyTorch博客 - 代码解读 介绍环境配置项目目录结构QDN算法重要函数解读preprocess(observation)DeepNetWork(nn.Module)BirdDQN类主程序部分 介绍 在本博客中,我们将介绍如何使用QDN(Quantile Dueling Network)算法&#xf…

如何自己实现一个分布式事务

实现分布式事务是一个复杂的过程,它需要精心设计并考虑数据的一致性、系统的可用性和分区容错能力。分布式事务确保在分布式系统中,即使是跨多个数据库、服务或消息队列,事务要么完全成功,要么完全失败。 以下是实现分布式事务的…