IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> cmake实现Blib引用Alib C.exe引用Blib -> 正文阅读

[开发工具]cmake实现Blib引用Alib C.exe引用Blib

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

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

示例代码库链接 点击前往

背景及目的

背景

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

目的

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

代码结构介绍

整体结构
整体代码结构

Alib库
Alib库

Blib库
Blib库

Cexe库

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库
B库里有2个算法库。

执行

生成成功
结果1
结果2
功能正常

总结

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


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

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:38:54  更:2022-09-13 11:42:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:01:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码