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文件已经拷贝到生成的目录下#
完整的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)
分类:
cmake/autotool
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-05-20 在 Linux 上有哪些运行程序的方式?
2022-05-20 vector、map 判断某元素是否存在、查找指定元素
2021-05-20 vscode编辑远程linux系统下c/c++代码实现代码补全
2021-05-20 Linux development with C++ in Visual Studio
2021-05-20 用VS2015开发Linux程序详细教程-配置篇
2015-05-20 Eclipse + CDT + YAGARTO + J-Link,STM32开源开发环境搭建与调试
2015-05-20 Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 上