[CMake] 简单的样例工程
参考这篇 文章
工程目录
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] 简单的样例工程相关推荐
- JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例
什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...
- Dubbo 新增本地 IDE 插件,快速创建样例工程
Cloud Toolkit 是一个 IDE 插件,帮助开发者更高效地开发.测试.诊断并部署应用. Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Sp ...
- 【Flask框架】一. Flask框架初体验(配置环境 + 简单demo样例)
文章目录 一. Flask框架初体验(配置环境 + 简单demo样例) 虚拟环境 新建项目 将Pycharm改为FLASK_DEBUG模式 修改FLASK_DEBUG模式的步骤 配置文件 简单用法 U ...
- leveldb简单使用样例
个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 下面附几个leveldb的简单使用样例,包含写数据.查数据.遍历数据,仅供参考. 写数据 #i ...
- Prism安装、MVVM基础概念及一个简单的样例
一:Prism的下载和安装 1:在http://compositewpf.codeplex.com/上下载最新的包. 下载完毕后,运行之,选择解压目录解压之.解压完毕的根目录下有chm帮助文档. 2: ...
- 百度地图 Android SDK - 检索功能使用的简单演示样例
百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...
- Neo4j简单的样例
系统环境: Ubuntu 04.10 x64 一:安装 下载最新版:neo4j-community-2.2.3-unix.tar.gz 解压 cd neo4j-community-2.2.3/bin ...
- Yii学习笔记之二(使用gii生成一个简单的样例)
1. 数据库准备 (1) 首先我们建一数据库 yii2test 并建立一张表例如以下: DROP TABLE IF EXISTS `posts`; CREATE TABLE `posts` (`pos ...
- log4j(七)——log4j.xml简单配置样例说明
一:测试环境与log4j(一)--为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)这里栗子有一点特别呀!给出了包名唉!想必有用,是的,配置文件中要特别说明一下 ...
最新文章
- spring IOC创建对象方式
- Java开发中的23种设计模式详解(转)
- rm排除某个文件进行删除
- HDU 1271整数对
- Python-图像的手绘效果
- Python并发编程:多线程-死锁现象与递归锁
- Docker工具箱继续增加
- v-html可能导致的问题
- mosquitto源码分析(六)
- c++ string 末尾追加char字符
- Java Web ConnectionPool (连接池技术)
- 相机标定(二)—— 投影变换相关基础概述
- 分享 Android 手机屏幕录制并制作成 GIF 演示图片
- 工程电磁场matlab仿真,带电粒子在电磁场中运动的MATLAB仿真.doc
- Flash播放器常用参数设置_应用技巧
- Apple ipad发布会rtsp地址
- Mac上使用USB共享网络
- jmeter JSR223 PostProcessor 操作
- Eclipse各版本下载地址
- DoIP协议从入门到精通系列——车载网络拓扑
热门文章
- 帆软报表的excel导出,插件开发可用
- com.fr.decision.webservice.v10.login.LoginService
- 案例学习BlazeDS+Spring之八InSync06“松耦合”UI同步事件通知
- android 图片墙拼贴,三步搞定 用APP打造图片文字拼贴效果
- php upload 缓存_php-使用vich_uploader的liip_imagine无法创建缓存
- ajax中设置请求头和自定义请求头
- 编译期会出现错误提示有哪些_Webpack 5有哪些值得期待
- 计算机98k音乐,【土豆】handclap 98K 完整版
- tushare学习文档_介绍一个python股票分析包tushare——韭菜的自我修养
- java里的foreach迭代器_java 中 for 、foreach 和 迭代器 的学习笔记