参考这篇 文章

工程目录

cmake-test/                 工程主目录,main.c 调用 libhello-world.so
├── CMakeLists.txt
├── hello-world             生成 libhello-world.so,调用 libhello.so 和 libworld.so
│   ├── CMakeLists.txt
│   ├── hello               生成 libhello.so
│   │   ├── CMakeLists.txt
│   │   ├── hello.c
│   │   └── hello.h         libhello.so 对外的头文件
│   ├── hello_world.c
│   ├── hello_world.h       libhello-world.so 对外的头文件
│   └── world               生成 libworld.so
│       ├── CMakeLists.txt
│       ├── world.c
│       └── world.h         libworld.so 对外的头文件
└── main.c

调用关系

                             ├────libhello.so
可执行文件────libhello-world.so├────libworld.so

关键字说明

PRIVATE:私有的。生成 libhello-world.so时,只在 hello_world.c 中包含了 hello.h,libhello-world.so 对外的头文件——hello_world.h 中不包含 hello.h。而且 main.c 不会调用 hello.c 中的函数,或者说 main.c 不知道 hello.c 的存在,那么在 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 提供的功能,只使用 hello.h 中的某些信息,比如结构体。但是 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)

实际上,这三个关键字指定的是目标文件依赖项的使用范围(scope)或者一种传递(propagate)。

  • main.c 不使用 libhello.so 的任何功能,因此 libhello-world.so 不需要将其依赖—— libhello.so 传递给 main.c,hello-world/CMakeLists.txt 中使用 PRIVATE 关键字;
  • main.c 使用 libhello.so 的功能,但是libhello-world.so 不使用,hello-world/CMakeLists.txt 中使用 INTERFACE 关键字;
  • main.c 和 libhello-world.so 都使用 libhello.so 的功能,hello-world/CMakeLists.txt 中使用 PUBLIC 关键字;

[CMake] 简单的样例工程相关推荐

  1. JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例

    什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...

  2. Dubbo 新增本地 IDE 插件,快速创建样例工程

    Cloud Toolkit 是一个 IDE 插件,帮助开发者更高效地开发.测试.诊断并部署应用. Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Sp ...

  3. 【Flask框架】一. Flask框架初体验(配置环境 + 简单demo样例)

    文章目录 一. Flask框架初体验(配置环境 + 简单demo样例) 虚拟环境 新建项目 将Pycharm改为FLASK_DEBUG模式 修改FLASK_DEBUG模式的步骤 配置文件 简单用法 U ...

  4. leveldb简单使用样例

    个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 下面附几个leveldb的简单使用样例,包含写数据.查数据.遍历数据,仅供参考. 写数据 #i ...

  5. Prism安装、MVVM基础概念及一个简单的样例

    一:Prism的下载和安装 1:在http://compositewpf.codeplex.com/上下载最新的包. 下载完毕后,运行之,选择解压目录解压之.解压完毕的根目录下有chm帮助文档. 2: ...

  6. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

  7. Neo4j简单的样例

    系统环境: Ubuntu 04.10 x64 一:安装 下载最新版:neo4j-community-2.2.3-unix.tar.gz  解压 cd neo4j-community-2.2.3/bin ...

  8. Yii学习笔记之二(使用gii生成一个简单的样例)

    1. 数据库准备 (1) 首先我们建一数据库 yii2test 并建立一张表例如以下: DROP TABLE IF EXISTS `posts`; CREATE TABLE `posts` (`pos ...

  9. log4j(七)——log4j.xml简单配置样例说明

    一:测试环境与log4j(一)--为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)这里栗子有一点特别呀!给出了包名唉!想必有用,是的,配置文件中要特别说明一下 ...

最新文章

  1. spring IOC创建对象方式
  2. Java开发中的23种设计模式详解(转)
  3. rm排除某个文件进行删除
  4. HDU 1271整数对
  5. Python-图像的手绘效果
  6. Python并发编程:多线程-死锁现象与递归锁
  7. Docker工具箱继续增加
  8. v-html可能导致的问题
  9. mosquitto源码分析(六)
  10. c++ string 末尾追加char字符
  11. Java Web ConnectionPool (连接池技术)
  12. 相机标定(二)—— 投影变换相关基础概述
  13. 分享 Android 手机屏幕录制并制作成 GIF 演示图片
  14. 工程电磁场matlab仿真,带电粒子在电磁场中运动的MATLAB仿真.doc
  15. Flash播放器常用参数设置_应用技巧
  16. Apple ipad发布会rtsp地址
  17. Mac上使用USB共享网络
  18. jmeter JSR223 PostProcessor 操作
  19. Eclipse各版本下载地址
  20. DoIP协议从入门到精通系列——车载网络拓扑

热门文章

  1. 帆软报表的excel导出,插件开发可用
  2. com.fr.decision.webservice.v10.login.LoginService
  3. 案例学习BlazeDS+Spring之八InSync06“松耦合”UI同步事件通知
  4. android 图片墙拼贴,三步搞定 用APP打造图片文字拼贴效果
  5. php upload 缓存_php-使用vich_uploader的liip_imagine无法创建缓存
  6. ajax中设置请求头和自定义请求头
  7. 编译期会出现错误提示有哪些_Webpack 5有哪些值得期待
  8. 计算机98k音乐,【土豆】handclap 98K 完整版
  9. tushare学习文档_介绍一个python股票分析包tushare——韭菜的自我修养
  10. java里的foreach迭代器_java 中 for 、foreach 和 迭代器 的学习笔记