一、概述

CMake中经常会使用 target_**() 相关命令,target_**() 命令支持通过 PUBLICPRIVATE 和 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相关推荐

  1. cmake / target_** 中的 PUBLIC,PRIVATE,INTERFACE

    一.指令说明 target_include_directories():指定目标包含的头文件路径.官方文档 target_link_libraries():指定目标链接的库.官方文档 target_c ...

  2. php中public放什么,PHP中常用关键字public, private, protected, static...

    PHP中常用的关键字:public, private, protected, static, interface, implements, final 1.public.protected.priva ...

  3. public,private,protected访问权限在Java,C++中的解析

    Java中: Java中的访问权限有public,private,protected和默认的包访问权限,如果类中的属性方法没有显示的指明访问权限,则具有包访问权限,我喜欢称它为packeged权限,很 ...

  4. PHP Class中public,private,protected,static的区别

    PHP Class中public,private,protected,static的区别 public:权限是最大的,可以内部调用,实例调用,可以被继承. protected:受保护类型,用于本类和继 ...

  5. dim private public static_PHP中const,static,public,private,protected的区别

    const: 定义常量,一般定义后不可改变 static: 静态,类名可以访问 public: 表示全局,类内部外部子类都可以访问: private: 表示私有的,只有本类内部可以使用: protec ...

  6. php class中public,private,protected的区别以及实例分析

    本篇文章是对php class中public,private,protected的区别以及实例进行了详细的分析介绍,需要的朋友参考下 一,public,private,protected的区别 pub ...

  7. CMake中target_compile_features的使用

    CMake中的target_compile_features命令用向target添加预期的编译器功能(compiler features),其格式如下: target_compile_features ...

  8. CMake中link_directories/target_link_directories的使用

    CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for librarie ...

  9. CMake中add_compile_options/target_compile_options的使用

    CMake中的add_compile_options命令用于向源文件的编译添加选项,其格式如下: add_compile_options(<option> ...) 将选项添加到COMPI ...

最新文章

  1. python字典遍历的几种方法(for in 用法)
  2. OpenJDK 14 性能保持提升,但 OpenJDK 8 仍是最强王者
  3. ROS系统实现 tf坐标系广播与监听
  4. EF关闭自动创建数据库表的方式
  5. C++学习之路 | PTA乙级—— 1036 跟奥巴马一起编程 (15 分)(精简)
  6. 整理了Kafka的一些常用工具,建议收藏备用!| 博文精选
  7. zabbix客户端掉线查看进程time_wait过多
  8. java配置springmvc_告别XML 使用JAVA配置SpringMVC
  9. oracle修改只读数据库中,如何在oracle中创建只读数据库链接
  10. 谷歌输入法linux下载官网下载软件,linux下安装谷歌拼音输入法
  11. 微信小程序 上传头像截图功能
  12. 写在前面 - 跟小智一起学网络(1)
  13. 浙江工商大学计算机技术专硕,浙江工商大学会计专硕(MPAcc)项目介绍
  14. 详解FindBugs的各项检测器
  15. Clipboard -- 剪贴板操作
  16. 洗地机那个牌子好?洗地机品牌排行榜
  17. 位置式PID与增量式PID区别浅析(百度百科增量式PID讲解思路概念更明确清晰)
  18. WebGIS开发绘制地图标注
  19. C语言计算一个整数的位数
  20. 3 MySQL数据管理

热门文章

  1. Andriod开发技巧——Fragment的懒载入
  2. 关于SQL Server数据库中的标识列
  3. 某android平板项目开发笔记--自定义sharepreference UI
  4. 【视频】React redux toolkit创建状态切片
  5. kubeadm加载k8s镜像实现集群搭建
  6. Spark3.1.1 Docker镜像中修改/etc/hosts
  7. Linux安装docker-compose 1.27.4
  8. Python3比较运算符
  9. synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处
  10. 请简要说明一下CyclicBarrier和CountDownLatch的区别?