首页 > 其他分享 >cmake配置项目引用动态库

cmake配置项目引用动态库

时间:2024-08-05 16:09:00浏览次数:16  
标签:动态 cmake Highlighter 引用 CMAKE calc DIR hljs

 

note#

  • 本文将介绍使用FIND_PACKAGE配置项目动态库的方法
  • cmake version: 3.18
  • platform: win10 20H2

概述#

  • 创建了一个动态库,再由主项目调用该动态库。
  • find<lib库名>.cmake的内容是: 1.定义动态库的头文件所在路径 2. 定义库所在路径
  • 写好cmake文件后,也可以方便给其他人调用,省却了编写的麻烦

目录结构#

Copy Highlighter-hljs
.
│  CMakeLists.txt		# cmake的配置文件
│  
├─build			# 存放 cmake配置生成的文件
├─cmake
│      findcalc.cmake		# 动态库的cmake文件
│      
├─ext			# 第三方库存放目录
│  └─calc		# 编写的动态库存放目录
│      ├─dll	# dll 文件所在目录
│      │  └─debug	# debug配置下生成的动态库
│      │          calc.dll
│      │          
│      ├─include # 动态库头文件所在路径
│      │      calc_interface.h
│      │      
│      └─lib		# 动态库的库文件
│              calc.lib
│              
└─src		# 主项目的源文件
        main.cc

动态库已经写好,下面开始编写配置文件。

编写 find<lib库名>.cmake文件#

正如上面的名字,我这里定义的是名为findcalc.cmake的文件,放在 cmake目录下,内容如下

Copy Highlighter-hljs
# 指定库头文件所在路径
FIND_PATH(calc_INCLUDE_DIR calc_interface.h ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/include)

# 指定库文件所在路径
FIND_LIBRARY(calc_LIBRARY calc.lib ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/lib)

# 为了下游可以继续使用
set(calc_FOUND FALSE)
if (calc_INCLUDE_DIR AND calc_LIBRARY)
	set(calc_FOUND TRUE)
endif()

这个文件主要用于CMakeLists.txt中引用动态库

编写CMakeLists.txt#

指定cmake版本#

Copy Highlighter-hljs
cmake_minimum_required(VERSION 3.18)

指定项目名#

Copy Highlighter-hljs
PROJECT(lib_demo)

将主项目src文件夹下的所有源文件拷贝到变量demo_src#

Copy Highlighter-hljs
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)

指定 cmake搜索库路径#

Copy Highlighter-hljs
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

重点来了,项目引用动态库#

重点来了,项目引用动态库#

重点来了,项目引用动态库#

Copy Highlighter-hljs
FIND_PACKAGE(calc REQUIRED)

创建可执行程序#

Copy Highlighter-hljs
add_executable(${PROJECT_NAME} ${demo_src})

主项目指定动态库头文件路径#

Copy Highlighter-hljs
target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})

注意: calc_INCLUDE_DIR来自cmake文件中定义的变量,方便下游使用

主项目连接动态库#

Copy Highlighter-hljs
target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})

拷贝动态库到可执行目录下#

Copy Highlighter-hljs
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        "${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/dll/$<CONFIGURATION>"
        $<TARGET_FILE_DIR:${PROJECT_NAME}>)

cmake配置结果#

转到 build目录,执行cmake .. 即可生成对应的 VS解决方案

使用VS打开解决方案,并生成对应的可执行程序,同时可以看见 ,dll文件已经拷贝到生成的目录下#

  • 生成前, 没有debug目录
  • 生成后,debug目录

完整的CMakeLists.txt#

Copy Highlighter-hljs
cmake_minimum_required(VERSION 3.18)

PROJECT(lib_demo)

# 2. to get all source files
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
FIND_PACKAGE(calc REQUIRED)

if (calc_FOUND)
	
	add_executable(${PROJECT_NAME} ${demo_src})

	# 指定库头文件路径
	target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})
	# 指定库名
	target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})

	add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        "${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/dll/$<CONFIGURATION>"
        $<TARGET_FILE_DIR:${PROJECT_NAME}>)

else()
	
	message(status "its not found")

endif(calc_FOUND)

ref:https://www.cnblogs.com/pandamohist/p/14247705.html

标签:动态,cmake,Highlighter,引用,CMAKE,calc,DIR,hljs
From: https://www.cnblogs.com/lidabo/p/18343406

相关文章

  • cmake引入第三方库的debug和release版本之Windows版本
    概述#本文将介绍cmak引入第三方库debug和release不同配置。Windows上,习惯将debug模式下生成的动态库名后缀添加D以作和release区分。cmake创建一个项目A,A引入动态库B,cmake怎么配置A链接动态库B的debug和release对应的库呢本文的教程是基于 这里,如果没有看,我推荐你先看......
  • vue2 - 最新详细实现高德地图绘制动态热力图详细教程,在某区域或城市地图上做“热力图
    效果图在vue2、nuxt2项目开发中,详解引入使用高德地图接收热力图数据并渲染“热力图”效果功能,在地图上的某个区域或某个城市(可多个)、省份等自由绘制对应的热力图层,各城市地区同时加载渲染热力流量区域用以对比,根据不同的颜色代表人口密度、客流量、旅游人数、交通流量......
  • 【动态规划】力扣918. 环形子数组的最大和
    给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i+1)%n],nums[i]的前一个元素是nums[(i-1+n)%n]。子数组最多只能包含固定缓冲区nu......
  • 动态规划之——背包DP(入门篇)
    文章目录概要说明01背包模板例题题意概要思路code1code201背包的应用题题目来源思路code完全背包模板例题题意概要思路code概要说明本文只讲了01背包和完全背包,至于其他背包问题后续补充01背包模板例题点击这里题意概要思路01背包的模板题首先对于背包问......
  • 快速幂的模板和维持动态变化中的最大值最小值,以及常见递归
      快速幂和大根堆小根堆都是一些需要记忆的东西,方便后面在题目中实现应用。图中的最短路径两个常用算法:  prim算法:通过小根堆来实现的,小根堆的作用是用来时刻维持状态的最小值。kruskal算法:核心手段(并查集)然后一开始是打算学习01bfs的,发现对于递归的过程确实还是理......
  • C++ 动态内存管理: `std::unique_ptr
    定义与头文件std::unique_ptr的功能定义于<memory>头文件中。它主要用于管理动态分配的内存,保证资源正确释放。函数模板std::make_unique非数组类型template<classT,class...Args>unique_ptr<T>make_unique(Args&&...args);C++14起用于构造非数组类......
  • js动态构建属性名并访问其对象属性(动态的对象或着数组名)
    js动态构建属性名并访问其对象属性(动态属性访问)在开发中有时会遇到这种情况:你写了很多的函数,写完发现他们的操作逻辑都是相同的,但是原始数据不同,如:/*获取区域,道路拥堵指数对应的色标*/makeCongestionColor(num){letoutColor='#fff'letcol......
  • 静态代理与动态代理区别?
    静态代理和动态代理是Java中常用的两种代理模式,用于为目标对象提供额外的功能。以下是它们的主要区别:静态代理代理类在编译时确定:静态代理类在编译时就已经存在,并且需要手动编写。代理类和目标类实现相同的接口:代理类和被代理的目标类都需要实现相同的接口。实现较......
  • 动态规划,蒙特卡洛,TD,Qlearing,Sars,DQN,REINFORCE算法对比
    动态规划(DynamicProgramming,DP)通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划的步骤识别子问题:定义问题的递归解法,识别状态和选择。确定DP数组:确定存储子问题解的数据结构,通常是数组或矩阵。确定状态转移方程:找出状态之间的关系,即状态转移方程。......
  • Day 32 动态规划 Part01
    动态规划解题步骤确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数显然dp[i]代表fib[i],fib[i]=fib[i-1]+fib[i-2],fib[0]=0,fib[1]=1,遍历从前往后遍历即可。下面的代码优化了空间复杂度,但思路是一致的。......