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

23 篇文章 0 订阅

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

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


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值