欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

cmake实现Blib引用Alib, C.exe引用Blib

示例代码库链接 点击前往

背景及目的

背景

  1. 算法项目中,可能一个团队有很多算法,但是具体上层应用就只用到几个。如果全部包含即使代码冗余,又使编译时也会慢很多。
  2. 基本思想是把功能进行拆分,然后分成很多个库,每个库用cmake来管理。
  3. 下面就以A,B,C为例,看如何把他们分成三个库,最终组合成一个可执行代码。

目的

A,B,C三个代码库是独立的,当有其他的库来引用A,B时,不需要复制代码只要在cmake中引入,就可以使用库函数了。这样做到简捷快速的搭建自己想要的应用。

代码结构介绍

整体结构

Alib库

Blib库

Cexe库

具体工作原理及实现

工作原理

基本工作原理是先对Alib库进行编译,然后Blib库中去引用Alib然后编译Blib库,最后Cexe库去引用Alib, Blib 最终编译,链接。

cmake编写

Alib库

主要工作,找出所有cpp文件,然后编译成一个静态Lib库。


cmake_minimum_required(VERSION 3.1)project(BasicTools)
message("${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR}")# 找到需要的cpp代码
file(GLOB_RECURSE CPP_FILES
${CMAKE_CURRENT_SOURCE_DIR}/PolyMesh/*.cpp
)message("cpp_files: ${CPP_FILES}")add_library(${PROJECT_NAME} STATIC ${CPP_FILES}) # 添加静态库编译set_target_properties(${PROJECT_NAME} PROPERTIES CLEAN_DIRECT_OUTPUT 1)target_include_directories(${PROJECT_NAME} PUBLIC ./include) # 发布一个库

Blib库

顶层cmake: 去包含一下所需要的lib库,这里是A库,然后生成B库

cmake_minimum_required(VERSION 3.1)project(CBB3DAlgorithm)add_subdirectory(../commonFunc/BasicTools ./BasicTools) # 包含A库
add_subdirectory(Dijkstra) # 调用生成B库过程

B库主要工作,找出所有cpp文件,然后编译成一个静态Lib库,链接下A库。

project(Dijkstra)
# message("${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR}")set(BasicTools_so ${PROJECT_BINARY_DIR}/BasicTools/Release/BasicTools.lib) # 设置所需要的lib
include_directories(../../commonFunc/BasicTools) # 包含Lib对应的头文件# 找出所需要的cpp
file(GLOB_RECURSE CPP_FILES
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
)message("cpp_files: ${CPP_FILES}")add_library(${PROJECT_NAME} STATIC ${CPP_FILES}) # 生成lib
link_directories(${BasicTools_so}) # 用来链接Alib库 与target_link_library 的区别set_target_properties(${PROJECT_NAME} PROPERTIES CLEAN_DIRECT_OUTPUT 1)target_include_directories(${PROJECT_NAME} PUBLIC .) # 发布lib

Cexe库

主要工作:

  1. 去包含一下所需要的lib库,这里是B库, 由于B库包含了A库,所以实际上A库也会被项目包进来,代码中可以直接使用。
  2. 添加可执行代码编译
  3. 链接所需要的库
cmake_minimum_required(VERSION 3.1)project(DIJKSTRA_TEST)add_subdirectory(../../CBB3DAlgorithm ./CBB3DAlgorithm) # 添加依赖库# 设置依赖的头文件
include_directories(../../CBB3DAlgorithm)
include_directories(../../commonFunc/BasicTools)# 设置依赖库lib文件
set(CBB3DAlgorithm_so ${PROJECT_BINARY_DIR}/CBB3DAlgorithm/Dijkstra/Release/Dijkstra.lib)
set(BasicTools_so ${PROJECT_BINARY_DIR}/CBB3DAlgorithm/BasicTools/Release/BasicTools.lib) # B库包含了A库,可以直接使用add_executable(main main.cpp) # 编译可执行文件target_link_libraries(main ${CBB3DAlgorithm_so} ${BasicTools_so}) # 链接用到的lib库

生成


最外层2个项目。

B库里有2个算法库。

执行




功能正常

总结

通过cmake代码管理,可以把重用的代码组织成多个代码库,在真正使用的时候再引入。这样可以提高代码的重用性,提高代码组织的效率,不用每次搞个新的实验或项目还要到处找代码去拼凑。


不让贴图了,欢迎关注[彬彬魔坊]

cmake实现Blib引用Alib, C.exe引用Blib相关推荐

  1. Visual studio那些破事。。。(生成静态库、生成动态库、引用静态库、引用动态库)

    共4个小步骤,每个小步骤你都可以新建个VS解决方案,自己跟着步骤跑一下,windows怎么[生成静态库.生成动态库.引用静态库.引用动态库]你就基本明白了@! 文章目录 1.导出静态库.lib(add ...

  2. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  3. java强引用弱引用_Java 的强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...

  4. 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)

    2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...

  5. java 静态内部类 弱引用_Java基础 强引用、弱引用、软引用、虚引用

    前言 在ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc.Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决 ...

  6. 15.赋值运算符为什么返回类的引用?不是引用怎么办?

    赋值运算符为什么返回类的引用?不是引用怎么办? class string{public:string(const char *str=NULL);string(const string& st ...

  7. java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍

    知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用.我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型 ...

  8. java符号引用 直接引用_JVM的符号引用和直接引用

    [导读]在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用 ...

  9. c++引用专题之常引用

    引用专题之常引用 常引用 使用变量初始化const引用 案例1 案例2 使用字面量常量初始化const引用 综合案例 const引用结论 综合练习 常引用 下面开始进入const引用难点 使用变量初始 ...

最新文章

  1. 中国计算机专业专科学校排名2015,计算机专科学校排名前十(最出名的10所计算机学院)...
  2. oracle23290,oracle标题
  3. 哪吒之魔童降世视听语言影评_国漫神作 再造辉煌——《哪吒之魔童降世》影评...
  4. 李宁-2015年7月13日-个人文档
  5. Win7文件夹属性没有共享标签页的解决方法
  6. 苹果WWDC2021终极剧透!新款Macbook Pro外观大改 iOS 15将发布
  7. robotac属于a类还是b类_工程项目分类A类、B类、C类、D类项目是指什么?注意:不是资料的A、B、C类报建资料...
  8. 基于视图的DNS解析
  9. Python学习教程(Python学习路线):Python3你还未get到的隐藏技能
  10. Vue在线预览word
  11. 头条 上传图片大小_遇到不会注册今日头条号,这么办?
  12. 三农数据(1990-2020)七:农村居民家庭生产现金支出、农村固定资产构成、固定资产投向
  13. W3school笔记——HTML
  14. logistic回归列线图(nomogram)的多种绘制方法
  15. 90%人不知道的大厂面试流程和技巧
  16. 天正电气插入图块非常小与比例不符合
  17. 双驰推大规模个性化定制生产迎来颠覆性变革
  18. 直播行业的梦幻泡影:主播们的数据人生
  19. 高通TrueWireless Mirroring无缝的用户体验镜像技术
  20. keil stm32标准库放在哪里_使用Keil MDK以及标准外设库创建STM32工程

热门文章

  1. 程序员如何查资料(百度、谷歌搜索技巧汇总)
  2. Android开发中app图标更换
  3. 邮件客户端软件常见故障
  4. 【zz】Linux下GUI开发:GTK+ 2.0 + anjuta + glade
  5. php 框架搭建,利用composer搭建一个PHP微框架(API微项目)
  6. [赛后总结]G2022 Regular Contest 13总结
  7. 坚定关于考研或者工作的决定:work
  8. 2022年你应该知道的15 款 Python 编辑器/ IDE
  9. mysql 产品文档_mysql产品页面
  10. 最新计算机技术信息传递,信息传递技术