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

cmake配置项目引用动态库

时间:2024-05-20 10:18:17浏览次数:29  
标签:动态 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)

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

相关文章

  • GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))
    1.GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))@目录1.GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))每博一文案2.代理模式的理解3.静态代理4.动态代理4.1JDK动态代理4.1.1JDK动态代理中(获取到目......
  • stm32cubemx+cmake vscode开发
    stm32cubemx在2.17之后可以新建cmake工程文件,然后就可以在vscode中无痛编译单片机程序,可以再配合openocd等编译调试下载1.准备1.1stm32cubemx1.2vscode1.3arm-none-eabi-gcc2.cubemx生成cmake工程文件2.1利用__weak函数实现cubemx代码与用户代码分离2.2利用宏定义......
  • 【uniapp 篇 】动态添加 表单,所添加元素展示在同一行
    动态添加表单,所添加元素展示在同一行1<uni-formslabelWidth="68px">23<uni-forms-itemv-for="(item,index)inbaseFormData.dynamicTable.timeField.array"4......
  • maven引用本地jar包
    背景:公司前置的项目包对接客户公司的sdk包,由于此前置项目完全定制化,且改sdk包非通用包,不好上传至公司的maven私服使用,故引入本地jar包,此处总结改方案1.代码引入第三方jar包在项目中新建成lib文件夹,结构与srv平级2.pom文件修改<dependency><groupId>cn.xxx</groupId>......
  • subList不能直接赋值给外部引用以达到修改的目的
    importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;classA{publicstaticvoidmain(String[]args){List<Integer>list=newArrayList<>();Collections.addAll(list,9,2,8,1,5,1);......
  • delphi安卓动态权限申请
    delphi安卓动态权限申请安卓8及以上版本,除了原来的静态权限申请以外,还需要动态权限申请。delphi10.3开始支持安卓动态权限申请。delphi11开始官方改变了安卓动态权限申请的参数类型,导致原来编写的代码,编码报错。下面的代码,可以很好地解决权限问题。兼顾了delphi10.3和delphi11......
  • [动态规划] 区间 dp
    区间dp石子合并将区间长度\(len\)作为\(dp\)的阶段设\(f[l][r]\)表示把最初的第\(l\)堆到第\(r\)堆石子合并成一堆,需要消耗的最少体力。合并代价就是这两堆石子的质量和,这里可以用前缀和直接计算,设\(s[i]\)表示前\(i\)堆石子的质量和。状态转移方程:\[f[l][r]......
  • CMake Tutorial
    step1theminalprojectcmake_minimum_required(VERSION3.10)project(Tutorial)add_executable(Tutorialtutorial.cxx)specifyingc++standardset(CMAKE_CXX_STANDARD11)set(CMAKE_CXX_STANDARD_REQUIREDTrue)projectversionproject(TutorialVERSION1.0)......
  • CMake Professtional-2 Variables
    set(varNamevalue...[PARENT_SCOPE])cmake中所有的值都是string,如果同时添加多个值,会自动添加;set(myVarabc)#myVar="a;b;c"set(myVara;b;c)#myVar="a;b;c"set(myVar"abc")#myVar="abc"set(myVarab;c)#myVar=&q......
  • CMake Professtional-1 Introduction
    thestageofcmakeGeneratingProjectFileschooseaprojectgenerator:Ninja,UnixMakefiles,MSYSMakefilesmkdirbuildcdbuildcmake-G"UnixMakefiles"../source#use--helpcandisplaythevariablecmake-G-hbuildingtoolcmake--bui......