一. 背景

在 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相关推荐

  1. Gcc详解以及静态库、动态库生成

    [转] Gcc详解以及静态库.动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1.gcc包含的c/c++编译 ...

  2. 1. CMake 系列 - 从零构建动态库和静态库

    目录 1. 文件目录结构 2. 库文件源代码 3. 编译生成库文件 1. 文件目录结构 首先创建如下目录结构: └── lib├── build # ├── CMakeLists.txt└── src ...

  3. c++ 类文件的动态库生成及调用例子

    https://blog.csdn.net/josiechen/article/details/70174445 首先,创建一个简单的类,类头文件的名称与项目工程的名称应该一致, 控制台项目工程名:t ...

  4. [动态库]动态库生成和使用以及Makefile编写

    转自:https://www.cnblogs.com/ljtknowns/p/5647793.html 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc ...

  5. Qt 调用CUDA静态库和动态库生成与配置

    前言 通过将CUDA相关计算操作放在库中,方便在项目中调用,省去了每次编译cu文件的麻烦,也便于集成到其他平台上. 关于部署CUDA加速的程序时,往往对CUDA加速的程序编译为动态链接库或者静态链接库 ...

  6. so动态库生成、链接方法

    1.动态库的编译 下面通过一个例子来介绍如何生成一个动态库.这里有一个头文件:test.h,三个.c文件:t1.c.t2.c.t2.c,我们将这几个文件编译成一个动态库:libtest.so. //t ...

  7. 在 windows 上如何根据 dll 动态库生成 lib 文件?

    在 windows 系统平台上,dll 动态库没有提供 .lib 文件,又不想动态获取函数地址怎么办? 使用 lib.exe 工具可以根据 .def 定义文件生成 .lib 文件. 例如,我这里有一个 ...

  8. 静态库和动态库生成教程

    1.静态库 私家车放在哪里都可以,编译的时候装载进来.不占用调用时间,代码占用体积大. 名称格式: linxx.a,其中xx 指代库名 1.生成需要的.o文件 2.生成libxx.a静态库 ar -c ...

  9. Qt C++ 录屏录音功能实现(avilib+ffmpeg)以及动态库生成

    实现一个录屏+录音的功能且需要快速开发,Qt无疑是一个非常好的选择.他有丰富的类库和接口可以很好的满足开发需求. 完整demo代码在文章最下方的百度网盘链接中,有需要的各位可以随意下载. 录屏部分 录 ...

最新文章

  1. c语言课设报告河海大学,2020河海大学计算机学硕838经验贴
  2. suse linux 文件只可读,SUSE LINUX下文件系统变只读的问题解决
  3. 前端学习(1730):前端系列javascript之发布窗口布局上
  4. 二级c语言上机程序填空,浙江省计算机二级c语言上机考试真题(二)程序填空
  5. 把服务器文件,如何把文件放在服务器
  6. sap脚本运行_如何使用Python脚本运行SAP?
  7. vue:无法将“vue”识别为脚本_Vue3将带来巨大的性能提升
  8. PHP中json_encode 中文解决方法
  9. 【python 类】【部分转发】设计模式 -- 责任链模式 (类之间的联动)
  10. UE4 植被工具的使用
  11. 文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance/Good Sync/Allway Sync)
  12. 音轨分离软件 Spleeter 使用教程及踩过的坑
  13. 微信开放平台修改微信分享的小图标后,移动端显示的分享的小图标未改变的问题解决
  14. RK3399 Android7.1 ACOVP导致系统死机
  15. 数据库修改密码的几种方法
  16. 用python做一个银行取款系统_我的第一个Python小程序,大老虎银行存取款机程序!支持转账...
  17. 计算机盘无法访问,电脑F盘没法访问,参数不正确?
  18. 《我是一只IT小小鸟》 读书笔记
  19. GO在windows环境下的下载以及环境配置
  20. 性格色彩测试android程序开发之三--dialog(续)

热门文章

  1. WEBSHELL跳板REDUH使用说明
  2. 【leetcode】Roman to Integer
  3. 一些可能没用过的调试窗口
  4. 需要反射时使用dynamic
  5. 一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?
  6. 浪潮服务器怎么装虚拟机,VMware 6.7系统安装步骤
  7. 网站发送邮件的邮箱服务器,教各位站长配置邮箱让网站能够发送Email邮件
  8. 固定表头和首行_Excel一步制作斜线表头!还有这些高分Excel表头技巧,看完秒会...
  9. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
  10. 156 13.67用matlab答案,数学实验(MATLAB版韩明版)5.1,5.3,5.5,5.6部分答案