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配置项目引用动态库的更多相关文章

  1. cocos2d-x android项目引用so库编译

    项目接了几十个渠道平台,每个平台都建了一个Android工程,引用Classes,由于才用java接口类来抽象出平台接口方法,所以每个工程的Android.mk是完全一致的,也就是说libgame.s ...

  2. linux 编译引用动态库时,报GLIBC_2,14 not found的处理方法

    这种错误一般是其引用的libc.so,其中含有版本较高的函数导致. 查看及解决办法: objdump -p ./libdmapi.so 显示: version References: ... requ ...

  3. cmake 创建并调用动态库和静态库

    编程之路刚刚开始,错误难免,希望大家能够指出. 刚刚开始学习cmake,写这篇之前我认真的看了“小代码2016”的博客,感觉很不错,看完之后我自己练习了一遍,记录一下. 1.首先建立好合适的目录结构, ...

  4. VC引用动态库

    1. 程序所在目录 2. 进程当前目录 3. 系统目录(C:\WINDOWS\System32) 4. Windows目录(C:\WINDOWS) 5. PATH环境变量指向的目录

  5. 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。

    在做支付项目时,引用动态库,动态库弹出支付宝或者微信的支付码,继而接收.最终将结果返回给调用动态库方法. 首先,动态库接收的是一个string 类型的xml,如 public string Pay(s ...

  6. 1.改变项目 动态库、静态库属性。 2.使用运行库 /MD、/MT、/LD说明

    /MD./MT./LD(使用运行库) 有关 C 运行库以及使用 /clr(公共语言运行时编译) 进行编译时要使用哪些库的更多信息,请参见 CRT 库功能. 传递给链接器的给定调用的所有模块都必须使用相 ...

  7. 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库

    编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...

  8. OS X 下动态库的引用

    foo.c #include <stdio.h> void foo(void) { printf("foo.\n"); } main.c #include <st ...

  9. CMake设置生成vs工程的动态库输出路径

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在网上搜了很多的资料,发现CMake不能设置一个动态库工程的输出目录和中间目录,难道除了VC之外其它编译器如gcc中没 ...

随机推荐

  1. Vue 中使用 TypeScript 详细总结

    VUE 项目中使用 Typescript 第一节:项目起步 Vue 中使用 TypeScript 项目中主要使用到的第三方依赖 vue2 vue-class-component vue-propert ...

  2. Neville 插值方法

    简介 wikipedia: Neville's method 在数学上,Neville 算法是一种计算插值多项式方法,由数学家Eric Harold Neville提出.由给定的n+1个节点,存在一个 ...

  3. you crash I crash

    今天一大早起来,zabbix报错了 我去查看了mysql的状态 MySQL is not running, but lock file (/var/lock/subsys/mysql) exists ...

  4. Linux-设置终端界面的字体颜色和自定义常用快捷功能

    .bashrc是一个隐藏的文件,要打开并修改该文件需要: (0)命令:cd ~ (1)命令:ls -a 找到文件 .bashrc: (2) 命令 vim ~/.bashrc 进入到文件: (3) 直接 ...

  5. 23-Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  6. MYSQL(3)

    加载C盘下的目录 全表查询 查询部分字段 查询总数 条件过滤 and or 包含 范围检查 between and 否定结果not 匹配任意字符    like 以什么开始^   rlike 以什么结 ...

  7. 10 — springboot整合mybatis — 更新完毕

    1.xml版 -- 复杂sql使用xml,简单sql使用注解 1).导入依赖 <!-- mybatis-spring-boot-starter是第三方( mybatis )jar包,不是spri ...

  8. Swift-技巧(十一)重写运算符

    摘要 基础数据的运算可以直接使用四则运算符.在 Swift 中也可以通过重写四则运算符的方式,让 struct 或者 class 创建的结构体或者对象也能像基础数据那样直接使用四则运算符. Swift ...

  9. CSS系列,清除浮动方法总结

    在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素.在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外 ...

  10. oracle中分组中的ROLLUP和CUBE选项

    在进行多列分组统计时,如果直接使用GROUP BY子句指定分组列,则只能生成基于所有分组列的统计结果.如果在GROUP BY子句中使用ROLLUP语句或CUBE语句,除了生成基于所有指定列的分组统计外 ...