欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
cmake实现Blib引用Alib, C.exe引用Blib
示例代码库链接 点击前往
背景
目的
A,B,C三个代码库是独立的,当有其他的库来引用A,B时,不需要复制代码只要在cmake中引入,就可以使用库函数了。这样做到简捷快速的搭建自己想要的应用。
整体结构
Alib库
Blib库
Cexe库
基本工作原理是先对Alib库进行编译,然后Blib库中去引用Alib然后编译Blib库,最后Cexe库去引用Alib, Blib 最终编译,链接。
主要工作,找出所有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) # 发布一个库
顶层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
主要工作:
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代码管理,可以把重用的代码组织成多个代码库,在真正使用的时候再引入。这样可以提高代码的重用性,提高代码组织的效率,不用每次搞个新的实验或项目还要到处找代码去拼凑。
不让贴图了,欢迎关注[彬彬魔坊]