CMake 中的 PUBLIC,PRIVATE,INTERFACE
一、概述
CMake中经常会使用 target_**()
相关命令,target_**()
命令支持通过 PUBLIC
,PRIVATE
和 INTERFACE
关键字来控制传播。本文主要介绍下这三个关键字的区别。
二、解释
以 target_link_libraries(A B)
命令为例,从理解的角度解释:
PRIVATE
依赖项 B 仅链接到目标 A,若有 C 链接了目标 A,C 不链接依赖项 B 。INTERFACE
依赖项 B 并不链接到目标 A,若有 C 链接了目标 A,C 会链接依赖项 B 。PUBLIC
依赖项 B 链接到目标 A,若有 C 链接了目标 A,C 也会链接依赖项 B 。
从使用的角度解释,若有 C 链接了目标 A :
- 如果依赖项 B 仅用于目标 A 的实现,且不在头文件中提供给 C 使用,使用
PRIVATE 。
- 如果依赖项 B 不用于目标 A 的实现,仅在头文件中作为接口提供给 C 使用,使用
INTERFACE 。
- 如果依赖项 B 不仅用于目标 A 的实现,而且在头文件提供给 C 使用,使用
PUBLIC 。
例 子
举一个简单的例子说明一下
add_library(C c.cpp)
add_library(D d.cpp)add_library(B b.cpp)
target_link_libraries(B PUBLIC C)
target_link_libraries(B PRIVATE D)add_executable(A a.cpp)
target_link_libraries(A B)
因为 C 是 B 的 PUBLIC 依赖项,所以其会被传播到 A 。
因为 D 是 B 的 PRIVATE 依赖项,所以其不会传播到 A 。
三、补充
这里补充下使用 target_**()
相关命令,有无 target
的区别。
以 target_include_directories()
命令为例,include_directories(dir)
是一个全局设置,其会将 dir
添加到当前 CMakeLists 文件中每个目标的 INCLUDE_DIRECTORIES
属性中。即当前 CMakeLists 文件其下所有的子目录都会添加 dir 目录。
因此,建议使用有 target
的命令来减少不必要或多余的目录包含和链接。
转载:CMake 中的 PUBLIC,PRIVATE,INTERFACE - 简书
(SAW:Game Over!)
CMake 中的 PUBLIC,PRIVATE,INTERFACE相关推荐
- cmake / target_** 中的 PUBLIC,PRIVATE,INTERFACE
一.指令说明 target_include_directories():指定目标包含的头文件路径.官方文档 target_link_libraries():指定目标链接的库.官方文档 target_c ...
- php中public放什么,PHP中常用关键字public, private, protected, static...
PHP中常用的关键字:public, private, protected, static, interface, implements, final 1.public.protected.priva ...
- public,private,protected访问权限在Java,C++中的解析
Java中: Java中的访问权限有public,private,protected和默认的包访问权限,如果类中的属性方法没有显示的指明访问权限,则具有包访问权限,我喜欢称它为packeged权限,很 ...
- PHP Class中public,private,protected,static的区别
PHP Class中public,private,protected,static的区别 public:权限是最大的,可以内部调用,实例调用,可以被继承. protected:受保护类型,用于本类和继 ...
- dim private public static_PHP中const,static,public,private,protected的区别
const: 定义常量,一般定义后不可改变 static: 静态,类名可以访问 public: 表示全局,类内部外部子类都可以访问: private: 表示私有的,只有本类内部可以使用: protec ...
- php class中public,private,protected的区别以及实例分析
本篇文章是对php class中public,private,protected的区别以及实例进行了详细的分析介绍,需要的朋友参考下 一,public,private,protected的区别 pub ...
- CMake中target_compile_features的使用
CMake中的target_compile_features命令用向target添加预期的编译器功能(compiler features),其格式如下: target_compile_features ...
- CMake中link_directories/target_link_directories的使用
CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for librarie ...
- CMake中add_compile_options/target_compile_options的使用
CMake中的add_compile_options命令用于向源文件的编译添加选项,其格式如下: add_compile_options(<option> ...) 将选项添加到COMPI ...
最新文章
- python字典遍历的几种方法(for in 用法)
- OpenJDK 14 性能保持提升,但 OpenJDK 8 仍是最强王者
- ROS系统实现 tf坐标系广播与监听
- EF关闭自动创建数据库表的方式
- C++学习之路 | PTA乙级—— 1036 跟奥巴马一起编程 (15 分)(精简)
- 整理了Kafka的一些常用工具,建议收藏备用!| 博文精选
- zabbix客户端掉线查看进程time_wait过多
- java配置springmvc_告别XML 使用JAVA配置SpringMVC
- oracle修改只读数据库中,如何在oracle中创建只读数据库链接
- 谷歌输入法linux下载官网下载软件,linux下安装谷歌拼音输入法
- 微信小程序 上传头像截图功能
- 写在前面 - 跟小智一起学网络(1)
- 浙江工商大学计算机技术专硕,浙江工商大学会计专硕(MPAcc)项目介绍
- 详解FindBugs的各项检测器
- Clipboard -- 剪贴板操作
- 洗地机那个牌子好?洗地机品牌排行榜
- 位置式PID与增量式PID区别浅析(百度百科增量式PID讲解思路概念更明确清晰)
- WebGIS开发绘制地图标注
- C语言计算一个整数的位数
- 3 MySQL数据管理
热门文章
- Andriod开发技巧——Fragment的懒载入
- 关于SQL Server数据库中的标识列
- 某android平板项目开发笔记--自定义sharepreference UI
- 【视频】React redux toolkit创建状态切片
- kubeadm加载k8s镜像实现集群搭建
- Spark3.1.1 Docker镜像中修改/etc/hosts
- Linux安装docker-compose 1.27.4
- Python3比较运算符
- synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处
- 请简要说明一下CyclicBarrier和CountDownLatch的区别?