cmake配置项目引用动态库

note

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

概述

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

目录结构

.
│  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目录下,内容如下

# 指定库头文件所在路径
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版本

cmake_minimum_required(VERSION 3.18)

指定项目名

PROJECT(lib_demo)

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

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)

指定 cmake搜索库路径

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

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

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

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

FIND_PACKAGE(calc REQUIRED)

创建可执行程序

add_executable(${PROJECT_NAME} ${demo_src})

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

target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})

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

主项目连接动态库

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}>)

cmake配置结果

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

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

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

完整的CMakeLists.txt

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)

posted @ 2021-01-07 21:38  mohist  阅读(13294)  评论(4编辑  收藏  举报