• 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) # 发布一个库
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    Blib库

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

    cmake_minimum_required(VERSION 3.1)
    
    project(CBB3DAlgorithm)
    
    add_subdirectory(../commonFunc/BasicTools ./BasicTools) # 包含A库
    add_subdirectory(Dijkstra) # 调用生成B库过程
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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库
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    生成

    生成

    最外层
    最外层2个项目。
    B库
    B库里有2个算法库。

    执行

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

    总结

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


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

  • 相关阅读:
    PromptScript:轻量级 DSL 脚本,加速多样化的 LLM 测试与验证
    面向对象编程 上 (1)
    【分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人(8/10)】
    传参base64时的+号变空格问题
    【算法】过桥
    three.js 第五十四用如何给shader传递结构体数组
    【LeetCode每日一题】——374.猜数字大小
    基于STM32设计的小龙虾养殖系统(带手机APP)
    Java算法(九):过滤集合:封装方法,实现对一个Student类中的学生信息的筛选 && 并且返回一个新的集合 && 遍历集合调用
    [论文必备]最强科研绘图分析工具Origin(2)——简单使用教程
  • 原文地址:https://blog.csdn.net/chenbb1989/article/details/126802142