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

CMakeLists.txt语法规则:部分常用命令说明四

一.  简介

前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下:

CMakeLists.txt语法规则:部分常用命令说明一-CSDN博客

CMakeLists.txt语法规则:部分常用命令说明二-CSDN博客

CMakeLists.txt语法规则:部分常用命令说明三-CSDN博客

本文继续学习 CMakeLists.txt语法中两个常用命令:target_include_directories命令 和 target_link_libraries命令。

二.  CMakeLists.txt语法规则:部分常用命令

target_include_directories命令 和 target_link_libraries命令

target_include_directories 命令为指定目标设置头文件搜索路径。
target_link_libraries 命令为指定目标设置链接库文件。
这听起来跟 include_directories link_libraries 命令有着相同的作用,确实如此,它们的 功能的确相同,但是在一些细节方面却有不同。
target_include_directories target_link_libraries 命令定义如下所示:
target_include_directories(<target> [SYSTEM] [BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])target_link_libraries(<target><PRIVATE|PUBLIC|INTERFACE> <item>...[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

这俩命令都有一个相同的参数 <target> 目标,这个目标指的就是譬如 add_executable add_library 命令所创建的目标。
首 先 对 于 target_include_directories 命 令 来 说 , SYSTEM BEFORE 这 两 个 选 项 与
include_directories 命令中 SYSTEM BEFORE 选项的意义相同。
如果使用 SYSTEM 选项,会把指定目录当成系统的搜索目录。 通过  BEFORE 选项可显式指定添加到列表的前面。

我们重点关注的是 INTERFACE|PUBLIC|PRIVATE 这三个选项有何不同?
通过一个示例向大家说明,譬如工程目录结构如下所示:

调用关系:

根据以上工程,我们对 INTERFACE PUBLIC PRIVATE 三个关键字进行说明:
PRIVATE 私有的。
main.c 程序调用了 libhello_world.so 。生成 libhello_world.so 时,只在 hello_world.c 中包含了 hello.h libhello_world.so 对外的头文件: hello_world.h 头文件中不包含 hello.h
而且 main.c 不会调用 hello.c 中的函数,或者说 main.c 不知道 hello.c 的存在,它只知道 libhello_world.so 的存在;
那么在 hello_world/CMakeLists.txt 中应该写入:
target_link_libraries(hello_world PRIVATE hello)
target_include_directories(hello_world PRIVATE hello)

INTERFACE 接口。
生成 libhello_world.so 时,只在 libhello_world.so 对外的头文件: hello_world.h 文件 中包含了 hello.h hello_world.c 中不包含 hello.h ,即 libhello_world.so 不使用 libhello.so 提供的功能,但是 main.c 需要使用 libhello.so 中的功能。
那么在 hello_world/CMakeLists.txt 中应该写入:
target_link_libraries(hello-world INTERFACE hello)
target_include_directories(hello-world INTERFACE hello)

PUBLIC 公开的。
PUBLIC = PRIVATE + INTERFACE 。生成 libhello_world.so 时,在 hello_world.c 和 hello_world.h 中 都 包 含 了 hello.h 。 并 且 main.c 中 也 需 要 使 用 libhello.so 提 供 的 功 能 。
那 么 在 hello_world/CMakeLists.txt 中应该写入:
target_link_libraries(hello-world PUBLIC hello)
target_include_directories(hello-world PUBLIC hello)

对于 target_include_directories命令 来说,这些关键字用于指示 何时 需要传递给目标的 包含目录列表 ,指定了 包含目录列表 的使用范围( scope ):
当使用 PRIVATE 关键字修饰时,意味着 包含目录列表 仅用于当前目标;
当使用 INTERFACE 关键字修饰时,意味着 包含目录列表 不用于当前目标、只能用于依赖该目标的其它目标,也就是说 cmake 会将 包含目录列表 传递给当前目标的依赖目标;
当使用 PUBLIC 关键字修饰时,这就是以上两个的集合, 包含目录列表 既用于当前目标、也会传递给当前目标的依赖目标。

对于 target_link_libraries命令 亦是如此,只不过 包含目录列表 换成了 链接库列表 譬如:
target_link_libraries(hello_world INTERFACE hello)
表示目标 hello_world 不需要链接 hello 库,但是对 hello_world 目标的依赖目标(依赖于 hello_world 的目标)它们需要链接 hello 库。
以上便是对 INTERFACEPUBLICPRIVATE 这三个关键字的概括性理解,所以整出这几个关键 字主要还是为了控制包含目录列表链接库列表的使用范围,这就是 target_include_directories
target_link_libraries 命令与 include_directorieslink_libraries 命令的不同之处。
target_include_directories() 功能与 target_link_libraries()的功能完全可以使用 include_directories()link_libraries()来实现。
但是笔者强烈建议大家使用 target_include_directories()和 target_link_libraries()。为什么?保持清晰!
include_directories() link_libraries() 是针对当前源码中的所有目标,并且还会向下传递(譬如通过 add_subdirectory 加载子源码时,也会将其传递给子源码)。
在一个大的工程当中,这通常不规范、有时还 会编译出现错误、混乱,所以我们应尽量使用 target_include_directories() target_link_libraries() ,保持整个 工程的目录清晰。

下一篇文章继续学习 CMakeLists.txt语法的一个常用命令: message命令。

相关文章:

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;部分常用命令说明二-CSDN博客 CMakeLi…...

学习前端第三十二天(Rest 参数与 Spread 语法,变量作用域,闭包)

一、Rest 参数与 Spread 语法 1.rest参数 ...变量名&#xff1a;收集剩余的参数并存进指定数组中&#xff0c;需要放到最后&#xff1b; 2.arguments变量 // arguments,以参数在参数列表中的索引作为键&#xff0c;存储所有参数,以类数组对象的形式输出所有函数参数 // 箭头…...

mysql从入门到起飞+面试基础题

mysql基础 MySQL基础 企业面试题1 代码 select m.id,m.num from ( select t.id as id,count(1) num from ( select ra.requester_id as id from RequestAccepted raunion all select ra.accepter_id as id from RequestAccepted ra ) t group by t.id ) m group by id ord…...

设计模式:命令模式

文章目录 一、什么是命令模式二、命令模式结构三、命令模式实现步骤四、命令模式应用场景 一、什么是命令模式 它允许将请求封装为对象&#xff0c;一个请求对应于一个命令&#xff0c;将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作&#xff1a;请求的一方…...

setinterval和settimeout区别在于

setinterval和settimeout区别在于 执行次数和执行频率 setInterval和setTimeout的主要区别在于执行次数和执行频率。以下是详细介绍&#xff1a;12 setTimeout是一次性的定时器&#xff0c;它在设定的延迟时间之后执行一次函数&#xff0c;然后停止。setInterval是重复性的定…...

shell_结束进程脚本

结束进程的shell脚本如下&#xff1a; #!/bin/bash# kill all process ps aux|grep "local" | grep -v grep | awk {print $2} | while read line; do kill -9 $line; done 解析&#xff1a; ps aux 命令常用于查看当前系统中运行的进程&#xff0c;以及它们所占用…...

GDPU unity游戏开发 碰撞器与触发器

砰砰叫&#xff0c;谁动了她的奶酪让你的小鹿乱撞了。基于此&#xff0c;亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲&#xff0c;碰撞器检测碰撞&#xff0c;触发器检测触发&#xff0c;讲了跟没讲似的。碰撞器是用来检测碰撞事件的&#xff0c;在unity中&#xff…...

IP地址定位技术在网络安全中的作用

在当今数字化时代&#xff0c;网络安全已经成为企业、政府和个人面临的重要挑战之一。随着互联网的普及和网络攻击的增加&#xff0c;保护个人隐私和防止网络犯罪变得尤为重要。在这一背景下&#xff0c;IP地址定位技术作为网络安全的重要组成部分之一&#xff0c;发挥着关键作…...

R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包

创建于&#xff1a;2024.5.4 R语言中&#xff0c;查看经安装的包&#xff0c;查看已经加载的包&#xff0c;查看特定包是否已经安装&#xff0c;安装包&#xff0c;更新包&#xff0c;卸载包 文章目录 1. 查看经安装的包2. 查看已经加载的包3. 查看特定包是否已经安装4. 安装包…...

spring boot3单模块项目工程搭建-下(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编程 ORM框架 数据连接池 接口测试、文档导出 缓存中间件 参数校…...

精准清理 MongoDB 数据:删除集合的正确姿势

在 MongoDB 数据库管理中&#xff0c;数据清理是维护数据库性能和保持数据一致性的关键步骤之一。而删除集合是实现数据清理的重要手段之一。在这个信息爆炸的时代&#xff0c;了解如何正确地执行集合删除操作至关重要。本文将深入探讨 MongoDB 中删除集合的常用方法、最佳实践…...

java 执行修改语句

你可以使用Java中的JDBC&#xff08;Java Database Connectivity&#xff09;来执行修改语句。以下是一个示例&#xff1a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class Main {public…...

【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …...

MFC 列表控件修改实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载&#xff09;》 2、程序功能选中列表控件某一项&#xff0c;修改这一项的按钮由禁止变为可用&#xff0c;双击这个按钮弹出对话框可对这一项的记录数据进行修改&#xff0c;点击确定保存修改数…...

QT设计模式:模板模式

基本概念 模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个操作中的算法的模板&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 实现的模块有&#xff1…...

8.k8s中网络资源service

目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型&#xff08;了解即可&#xff09; 4.service的externalname类型&#xff08;了解即可&#xff09; 三、nodeport的端口范围设置和svc的endpoint列表 1.修…...

51单片机keil编程中遇到的问题(持续更新)

字符无法打印报错 查看特殊功能寄存器名字的时候也会报错&#xff0c;因为无法编译通过&#xff0c;导致头文件的定义内容无法查找 keil编译中 error C127: ‘xx’: invalid storage class 这种一般是在编写头文件或源文件时&#xff0c;在声明函数的结尾没有添加分号&…...

C++类和对象详解(一)

目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…...

SCI论文检索报告长什么样?怎么出具?一文了解!

1、SCI检索报告是什么 SCI数据库收录最能反映基础学科研究水平和论文质量&#xff0c;该检索系统收录的科技期刊比较全面&#xff0c;可以说它是集中各个学科高质优秀论文的精粹&#xff0c;评职晋升、项目申报、评奖评优等很多关键时期&#xff0c;都需要开具已经在SCI发表的论…...

UE4_Water插件_Buoyancy组件使用

water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题: 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件,设置浮力点,应用水中牵引力。...

致开发者:别再重复造轮子,这个开源商城系统让你把时间花在刀刃上

作为开发者&#xff0c;你是否厌倦了每次新项目都要从零搭建电商后台&#xff1f;商品、订单、会员、营销……这些基础模块耗费了你多少宝贵的创造力&#xff1f;今天&#xff0c;我们想和你聊聊一个能让你“拿来即用&#xff0c;改也不难”的解决方案——CRMEB开源商城系统。它…...

利用通义千问模型辅助C语言学习:从基础语法到指针难题解析

利用通义千问模型辅助C语言学习&#xff1a;从基础语法到指针难题解析 学C语言&#xff0c;是不是经常卡在某个概念上&#xff0c;比如那个让人又爱又恨的“指针”&#xff1f;或者写了一段代码&#xff0c;运行结果和预想的完全不一样&#xff0c;却死活找不到原因&#xff1…...

FRCRN模型结构解析:频域卷积+循环网络如何协同提升信噪比

FRCRN模型结构解析&#xff1a;频域卷积循环网络如何协同提升信噪比 1. 引言&#xff1a;语音降噪的挑战与突破 语音降噪技术一直面临着"既要又要"的难题&#xff1a;既要彻底消除背景噪声&#xff0c;又要完整保留人声细节。传统的降噪方法往往在这两者之间难以平…...

告别复杂配置:SDXL 1.0电影级绘图工坊开箱即用体验

告别复杂配置&#xff1a;SDXL 1.0电影级绘图工坊开箱即用体验 1. 为什么选择SDXL 1.0电影级绘图工坊 在AI绘图领域&#xff0c;Stable Diffusion XL&#xff08;SDXL&#xff09;1.0代表了当前最先进的文本到图像生成技术。然而&#xff0c;对于大多数非技术背景的创作者来说…...

Android13 PendingIntent Flags: Choosing Between FLAG_IMMUTABLE and FLAG_MUTABLE for Optimal Performa

1. Android13 PendingIntent的Flags变革解析 最近在将项目从Android11迁移到Android13时&#xff0c;我遇到了一个典型的兼容性问题&#xff1a;Targeting S (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a Pendin…...

电商数据采集API接口||合规优先、稳定高效、数据精准

一、API 类型选型&#xff08;先选对&#xff0c;再做对&#xff09;优先按 “官方 → 第三方聚合 → 自建” 顺序选择&#xff0c;平衡合规、成本与效率&#xff1a;表格API 类型代表平台核心优势适用场景注意事项官方开放 API淘宝 TOP、京东万象、拼多多开放平台、亚马逊 SP-…...

HP-Socket创新项目原型迭代记录:变更、原因与效果

HP-Socket创新项目原型迭代记录&#xff1a;变更、原因与效果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket HP-Socket作为一款高性能TCP/UDP/HTTP通信组件&#xff0c;其…...

uStepper S开源库深度解析:闭环步进控制与TMC2130驱动实战

1. uStepper S 开源驱动库深度解析&#xff1a;面向嵌入式工程师的实战指南 uStepper S 是一款集成了高性能步进电机驱动、高精度磁编码器反馈、ARM Cortex-M0 微控制器&#xff08;NXP LPC11U35&#xff09;与丰富外设接口的智能运动控制模块。其配套的 uStepper S Arduino…...

Windows 内网 Web 服务穿透方案推荐

Windows 内网 Web 服务穿透方案推荐 面向场景&#xff1a;内网机器为 Windows&#xff0c;需从公网或外网访问内网 HTTP/HTTPS Web 服务&#xff1b;优先选择相对不易被误报、来源清晰、可审计的方案。 关于「报毒」的说明 穿透类软件常被启发式引擎标为「风险/可疑」&#xf…...

酷狗音乐API实战指南:解决音乐应用开发的三大核心痛点

酷狗音乐API实战指南&#xff1a;解决音乐应用开发的三大核心痛点 【免费下载链接】KuGouMusicApi 酷狗音乐 Node.js API service 项目地址: https://gitcode.com/gh_mirrors/ku/KuGouMusicApi 在构建现代音乐应用时&#xff0c;开发者常常面临歌词同步不精准、API接口分…...