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)
cmake配置项目引用动态库的更多相关文章
- cocos2d-x android项目引用so库编译
项目接了几十个渠道平台,每个平台都建了一个Android工程,引用Classes,由于才用java接口类来抽象出平台接口方法,所以每个工程的Android.mk是完全一致的,也就是说libgame.s ...
- linux 编译引用动态库时,报GLIBC_2,14 not found的处理方法
这种错误一般是其引用的libc.so,其中含有版本较高的函数导致. 查看及解决办法: objdump -p ./libdmapi.so 显示: version References: ... requ ...
- cmake 创建并调用动态库和静态库
编程之路刚刚开始,错误难免,希望大家能够指出. 刚刚开始学习cmake,写这篇之前我认真的看了“小代码2016”的博客,感觉很不错,看完之后我自己练习了一遍,记录一下. 1.首先建立好合适的目录结构, ...
- VC引用动态库
1. 程序所在目录 2. 进程当前目录 3. 系统目录(C:\WINDOWS\System32) 4. Windows目录(C:\WINDOWS) 5. PATH环境变量指向的目录
- 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。
在做支付项目时,引用动态库,动态库弹出支付宝或者微信的支付码,继而接收.最终将结果返回给调用动态库方法. 首先,动态库接收的是一个string 类型的xml,如 public string Pay(s ...
- 1.改变项目 动态库、静态库属性。 2.使用运行库 /MD、/MT、/LD说明
/MD./MT./LD(使用运行库) 有关 C 运行库以及使用 /clr(公共语言运行时编译) 进行编译时要使用哪些库的更多信息,请参见 CRT 库功能. 传递给链接器的给定调用的所有模块都必须使用相 ...
- 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库
编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...
- OS X 下动态库的引用
foo.c #include <stdio.h> void foo(void) { printf("foo.\n"); } main.c #include <st ...
- CMake设置生成vs工程的动态库输出路径
作者:朱金灿 来源:http://blog.csdn.net/clever101 在网上搜了很多的资料,发现CMake不能设置一个动态库工程的输出目录和中间目录,难道除了VC之外其它编译器如gcc中没 ...
随机推荐
- Macbookpro vim操作键说明
i → Insert 模式,按 ESC 回到 Normal 模式. x → 删当前光标所在的一个字符.:wq → 存盘 + 退出 (:w 存盘, :q 退出) (陈皓注::w 后可以跟文件名)dd → ...
- python爬虫之正则表达式(用在其他地方也可)
1. 常用的匹配规则 ### 常用的匹配规则 # \w 匹配字母.数字及下划线 # \W 匹配不是字母.数字及下划线的字符 # \s 匹配任意空白字符,等价于[\t\n\t\f] # \S 匹配任意非 ...
- Redis——面试官考题
总结: 本文在一次面试的过程中讲述了 Redis 是什么,Redis 的特点和功能,Redis 缓存的使用,Redis 为什么能这么快,Redis 缓存的淘汰策略,持久化的两种方式,Redis 高可用 ...
- 关于蓝牙Mesh您必须知道的七件事
蓝牙技术联盟于7月19日正式宣布,蓝牙(Bluetooth)技术开始全面支持Mesh网状网络.全新的Mesh功能提供设备间多对多传输,并特别提高构建大范围网络覆盖的通信能力,适用于楼宇自动化.无线传感 ...
- abide, able, abnormal
abide 近/反义词:1. 忍受: bear, endure, put up with, stand, tolerate2. 遵守(abide by): accept, comply, confor ...
- R语言学习记录(一)
(R基础) 对象:什么是对象呢,其实就是一个名称而已,在R中存储的数据 就是一个R对象 a <- 1 ###其中'<-'表示的是一个赋值符号 这句话表示的是,将1赋值给a b <- ...
- Vue相关,Vue生命周期及对应的行为
先来一张经典图 生命钩子函数 使用vue的朋友们知道,生命周期函数长这样- mounted: function() { } // 或者 mounted() { } 注意点,Vue的所有生命周期函数都是 ...
- [学习总结]2、android中的VelocityTracker(获得速率用的类)
参考资料:http://blog.jrj.com.cn/4586793646,5298605a.html 感谢这位兄弟! android.view.VelocityTracker主要用跟踪触摸屏事件( ...
- springboot+vue脚手架使用nginx前后端分离
1.vue配置 /** * * 相对于该配置的nginx服务器请参考nginx配置文件 * */ module.exports = { // 基本路径 publicPath: '/', // 输出文件 ...
- pipeline配置前端项目
vue pipeline { agent { label 'master'} options { timestamps() disableConcurrentBuilds() buildDiscard ...