CMake 打包已经存在的动态库生成 target
一. 背景
在 CMakeLists.txt 中,某模块 A 通过 add_subdirectory 引入模块 B ,模块 B 通过 add_subdirectory 引入模块 C。模块 C 里面本身就是一个开源的动态库,比如 libtask。目的想要将 C 模块打包成一个 Target ,以便在 A 模块中中使用方便。
二. 旧版本实现和存在问题
A 模块不直接使用 C 模块,但是 A 模块使用到了 B 模块,B 模块编译依赖 C 模块,就需要导致 A 编译时要通过下面的方式引入 C 模块
include_directories(${CMAKE_SOURCE_DIR}/thirdparty/B/thirdparty/C/include)link_directories(${CMAKE_SOURCE_DIR}/thirdparty/B/thirdparty/C/lib)
该使用方式 A 即为不友好。如果上层存在 M 模块依赖 A 模块,也要通过类似方式用 C,导致使用上极为不友好。
三.解决方案
在 CMake 中有 Target 的概念,尝试单独将 C 打包成一个 Target,这样之后,当 A 依赖 B 时,B 依赖 C,A 不需要直接通过上面相对路径的方式,因为 Target 已经被包进去了。于是在 C 模块中,将所有的已经存在的 so 打包起来:
cmake_minimum_required (VERSION 3.10)project(libtask)file(WRITE ${PROJECT_BINARY_DIR}/empty.cpp "")
add_library (${PROJECT_NAME} SHARED ${PROJECT_BINARY_DIR}/empty.cpp)target_include_directories(${PROJECT_NAME} PUBLIC include)
target_link_libraries(${PROJECT_NAME} PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-a.so${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-b.so
)
在 B 模块使用 A 模块时,可以使用下面的方式
xxx
add_subdirectory(thirdparty/libtask)
xxx
target_link_libraries(${PROJECT_NAME} PRIVATE libtask)
其他有问题的方案:
在实现 C 时也可以通过 INTERFACE 的方式打包 C,使用下面的方式:
cmake_minimum_required (VERSION 3.10)project(libtask)add_library (${PROJECT_NAME} INTERFACE)target_include_directories(${PROJECT_NAME} INTERFACE include)
target_link_libraries(${PROJECT_NAME} INTERFACE${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-a.so${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-b.so
)
由于想要使用 INTERFACE 的方式打包库文件,此时就就必须使用 INTERFACE 的方式包含头文件和库文件,这样子就导致外部 A 模块无法直接使用 C 的库文件和头文件,还要使用
xxx
add_subdirectory(thirdparty/libtask)
xxx
target_link_libraries(${PROJECT_NAME} PRIVATE libtask)
CMake 打包已经存在的动态库生成 target相关推荐
- Gcc详解以及静态库、动态库生成
[转] Gcc详解以及静态库.动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1.gcc包含的c/c++编译 ...
- 1. CMake 系列 - 从零构建动态库和静态库
目录 1. 文件目录结构 2. 库文件源代码 3. 编译生成库文件 1. 文件目录结构 首先创建如下目录结构: └── lib├── build # ├── CMakeLists.txt└── src ...
- c++ 类文件的动态库生成及调用例子
https://blog.csdn.net/josiechen/article/details/70174445 首先,创建一个简单的类,类头文件的名称与项目工程的名称应该一致, 控制台项目工程名:t ...
- [动态库]动态库生成和使用以及Makefile编写
转自:https://www.cnblogs.com/ljtknowns/p/5647793.html 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc ...
- Qt 调用CUDA静态库和动态库生成与配置
前言 通过将CUDA相关计算操作放在库中,方便在项目中调用,省去了每次编译cu文件的麻烦,也便于集成到其他平台上. 关于部署CUDA加速的程序时,往往对CUDA加速的程序编译为动态链接库或者静态链接库 ...
- so动态库生成、链接方法
1.动态库的编译 下面通过一个例子来介绍如何生成一个动态库.这里有一个头文件:test.h,三个.c文件:t1.c.t2.c.t2.c,我们将这几个文件编译成一个动态库:libtest.so. //t ...
- 在 windows 上如何根据 dll 动态库生成 lib 文件?
在 windows 系统平台上,dll 动态库没有提供 .lib 文件,又不想动态获取函数地址怎么办? 使用 lib.exe 工具可以根据 .def 定义文件生成 .lib 文件. 例如,我这里有一个 ...
- 静态库和动态库生成教程
1.静态库 私家车放在哪里都可以,编译的时候装载进来.不占用调用时间,代码占用体积大. 名称格式: linxx.a,其中xx 指代库名 1.生成需要的.o文件 2.生成libxx.a静态库 ar -c ...
- Qt C++ 录屏录音功能实现(avilib+ffmpeg)以及动态库生成
实现一个录屏+录音的功能且需要快速开发,Qt无疑是一个非常好的选择.他有丰富的类库和接口可以很好的满足开发需求. 完整demo代码在文章最下方的百度网盘链接中,有需要的各位可以随意下载. 录屏部分 录 ...
最新文章
- c语言课设报告河海大学,2020河海大学计算机学硕838经验贴
- suse linux 文件只可读,SUSE LINUX下文件系统变只读的问题解决
- 前端学习(1730):前端系列javascript之发布窗口布局上
- 二级c语言上机程序填空,浙江省计算机二级c语言上机考试真题(二)程序填空
- 把服务器文件,如何把文件放在服务器
- sap脚本运行_如何使用Python脚本运行SAP?
- vue:无法将“vue”识别为脚本_Vue3将带来巨大的性能提升
- PHP中json_encode 中文解决方法
- 【python 类】【部分转发】设计模式 -- 责任链模式 (类之间的联动)
- UE4 植被工具的使用
- 文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance/Good Sync/Allway Sync)
- 音轨分离软件 Spleeter 使用教程及踩过的坑
- 微信开放平台修改微信分享的小图标后,移动端显示的分享的小图标未改变的问题解决
- RK3399 Android7.1 ACOVP导致系统死机
- 数据库修改密码的几种方法
- 用python做一个银行取款系统_我的第一个Python小程序,大老虎银行存取款机程序!支持转账...
- 计算机盘无法访问,电脑F盘没法访问,参数不正确?
- 《我是一只IT小小鸟》 读书笔记
- GO在windows环境下的下载以及环境配置
- 性格色彩测试android程序开发之三--dialog(续)
热门文章
- WEBSHELL跳板REDUH使用说明
- 【leetcode】Roman to Integer
- 一些可能没用过的调试窗口
- 需要反射时使用dynamic
- 一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?
- 浪潮服务器怎么装虚拟机,VMware 6.7系统安装步骤
- 网站发送邮件的邮箱服务器,教各位站长配置邮箱让网站能够发送Email邮件
- 固定表头和首行_Excel一步制作斜线表头!还有这些高分Excel表头技巧,看完秒会...
- win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
- 156 13.67用matlab答案,数学实验(MATLAB版韩明版)5.1,5.3,5.5,5.6部分答案