cmake学习5:如何将自己的库作为第三方库给别人使用

2023-05-16

 

 前言: 自己在使用cmake进行编译工程的时候不太了解cmake的基本使用方法,有时候出现找不到第三方库的问题也不知如何排查,因此相对cmake有个稍微系统的认识,希望能用这个强大的工具来更好的为自己的工程服务,因此总结为了几篇博客,主要参考的是官网的Tutorial,加入了自己的认识,另外,其实cmake本质上是一个工具,工具的作用就是用来帮助我们更好的构建项目的,所以对于工具能够满足使用要求就好,不必细枝末节的完全掌握,如有错误请斧正.

测试cmake版本:3.20.4

测试平台:ubuntu16.04

Tutorial源代码:https://github.com/FreddyName/cmake_tutorialshttps://github.com/FreddyName/cmake_tutorials

系列博客目录:

cmake学习1: 基本的CMakeLists.txt的编写https://blog.csdn.net/Heart_M/article/details/120626697

cmake学习2: 如何将源代码编译成库并使用icon-default.png?t=L892https://blog.csdn.net/Heart_M/article/details/120632708

cmake学习3: 如何安装自己的工程在本地icon-default.png?t=L892https://blog.csdn.net/Heart_M/article/details/120640741

cmake学习4: 如何将自己的工程打包给别人icon-default.png?t=L892https://blog.csdn.net/Heart_M/article/details/120641933

cmake学习5: 如何将自己的库作为第三方库给别人使用icon-default.png?t=L892https://blog.csdn.net/Heart_M/article/details/120643023


我们在编写自己的程序的时候,经常会遇到需要引用第三方库的情况,而引用第三方库的本质就是包含其头文件和配置文件以及链接编译好的库,而作为库的作者,我们需要提供一些文件来让库的引用者能够很方便的找到库,这就是这一节的目的:如何让其他人方便的找到并使用我们的库!

其实使用前面的安装方式也可以找到第三方库,但是这一节要解决的问题场景是假如第三方库的头文件和库特别多,我们在进行target_link_libraries的时候总不能一个库一个库的添加, 所以cmake使用的方法是库的作者提供.cmake文件说明库的路径变量,然后使用者在CMakeLists.txt中使用find_package()命令先找到.cmake文件再找到头文件和库

在总结之前,我们需要了解一下find_package的工作原理和.cmake文件的作用,其实find_package就是根据路径搜索到.cmake文件然后根据.cmake文件的内容得到第三方库的位置,这一部分下面的博客讲述的很好:“轻松搞定CMake”系列之find_package用法详解_zhanghm1995的博客-CSDN博客

我们可以先回忆一下opencv是如何被利用的:

find_package(OpenCV 3 REQUIRED)

message(STATUS "OpenCV_DIR = ${OpenCV_DIR}")
message(STATUS "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV_LIBS = ${OpenCV_LIBS}")

include_directories(${OPENCV_INCLUDE_DIRS})  
add_executable(opencv_test opencv_test.cpp)  
target_link_libraries(opencv_test ${OpenCV_LIBS})

可以看到cmake使用find_package()命令找到Opencv库,然后opencv的头文件路径就别保存到OPENCV_INCLUDE_DIRS和OpenCV_LIBS 变量中, 而我们接下来就是实现.cmake文件,使得使用者能通过find_package()命令找到我们的库.

开始操作

之前我们通过install命令将MathFunctions库安装到了指定的位置,现在为了生成.cmake文件,我们需要在MathFunctions/CMakeLitsts.txt中将install命令更改如下:

install(TARGETS MathFunctions 
        DESTINATION lib
        EXPORT MathFunctionsTargets)

这个命令的意思是:将MathFunctions安装在/usr/local/lib下,然后将有关库的信息export为MathFunctionsTargets

既然得到了MathFunctionsTargets,那么我们就利用其生成.cmake文件并安装,在 CMakeLists.txt中增加如下命令:

install(EXPORT MathFunctionsTargets
        FILE MathFunctionsTargets.cmake
        DESTINATION lib/cmake/MathFunctions
)

这时,如果我们去运行cmake的时候,会报出如下错误:

这个错误的意思是:当export的时候会包含一个与本地机器绑定的一个路径,而这个路径与其他的机器并不匹配,而解决这个的方法就是在为MathFunctions库进行target_include_directories的时候让他知道当从build路径下被使用或者从package安装的位置被使用的时候需要不同的接口位置,因此更改此命令为:

target_include_directories(MathFunctions
          INTERFACE 
          $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
          $<INSTALL_INTERFACE:include>
)

现在我们已经打包了MathFunctions的信息,但是我们仍然需要一个MathFunctionsConfig.cmake文件来让find_package()命令能够找到我们的工程,这里我理解是find_package()只能找到固定命名类型的.cmake文件(参考上面的链接),这里生成 MathFunctionsConfig.cmake文件的目的是让find_package通过配置文件找到真正所需要的MathFunctionsTargets.cmake文件.

所以我们需要新建一个Config.cmake.in文件,然后使用cmake命令将其转为MathFunctionsConfig.cmake文件,Config.cmake.in文件的内容如下:

@PACKAGE_INIT@
include ( "${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake" )

之后我们在CMakeLists.txt中添加以下命令

include(CMakePackageConfigHelpers)

configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
  "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake"
  INSTALL_DESTINATION "lib/cmake/example"
  NO_SET_AND_CHECK_MACRO
  NO_CHECK_REQUIRED_COMPONENTS_MACRO
)

write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake"
  VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}"
  COMPATIBILITY AnyNewerVersion
)

install(FILES
  ${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake
  DESTINATION lib/cmake/MathFunctions
)
  • include的作用是包含构造Config相关的工具
  • configure_package_config_file是将Config.cmake.in配置成我们需要的MathFunctionsConfig.cmake文件
  • write_basic_package_version_file是生成工程版本信息的.cmake文件
  • install是将MathFunctionsConfig.cmake文件安装到指定位置

然后执行操作测验

mkdir build_Step5
cd build_Step5
cmake ../Step5
cmake --build .
cmake --install .

可以看到相关的文件被安装到: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake学习5:如何将自己的库作为第三方库给别人使用 的相关文章

  • Cannot find module ‘body-parser‘

    node modules下模块缺失 解决方案 xff1a npm install span class token operator span save body span class token operator span parser
  • C#中struct和class的区别

    本文详细分析了C 中struct和class的区别 xff0c 对于C 初学者来说是有必要加以了解并掌握的 简单来说 xff0c struct是值类型 xff0c 创建一个struct类型的实例被分配在栈上 class是引用类型 xff0c
  • 沁恒MCU串口使用指南

    转载注明出处 沁恒MCU串口使用指南 xff1a 适用于WCH的32位MCU和CH559 558单片机 只描述TTL电平的TX 43 RX形式的常规串口 xff0c 流控 xff0c RS232 RS485不在文章涉及范围之内 大部分8位机
  • ubuntu安装网络调试助手

    下载mNetAssist安装包 链接 https pan baidu com s 1eHalZSnsVKXRERmIOCfj0w 提取码 bhxs新建终端并切换到安装包所在目录sudo dpkg i mNetAssist release a
  • .s19 文件转换为 .hex 和 .bin文件的方法

    使用STVD开发时 xff0c 编译后产生的是 s19 文件 xff0c 与Keil 和 IAR常见的 hex bin文件不同 xff0c 那么如何将 s19文件转换为常见的文件格式呢 xff1f 一 获取工具 burner 下载链接 xf
  • VS Code中C/C++ 无法跳转到定义的解决办法

    VS code的跳转功能一直很迷 xff0c 时好时坏 xff0c 有些新的工程环境干脆用不了 经过一遍遍的baidu加上自己的摸索 xff0c 总结出一套经验 xff0c 应该可以解决大部分的情况了 一 首先 xff0c 当然是安装插件了
  • 使用void*强转函数指针(编辑中)

    别把函数名当成函数 xff0c just a 变量 typedef void AirCb void 空回调函数 typedef int aimFunction int para1 char para2 int para3 要传递的目标函数
  • KoroFileHeader 配置

    一 安装插件 二 Github 地址 https github com OBKoro1 koro1FileHeader 三 快速上手 https github com OBKoro1 koro1FileHeader wiki E5 AE 8
  • 网络接入与身份认证简介

    目录 1 认证简介 2 常见认证机制 基于口令的身份认证机制 挑战 响应认证机制 EAP认证机制 3 公钥认证机制 4 使用认证机制的认证协议 RADIUS认证协议 TACACS 43 认证协议 Kerberos认证协议 LDAP协议 5
  • VS Code常见问题

    1 更改自动补全 xff08 联想 xff09 快捷键的方法 文件 gt 首选项 gt 键盘快捷方式 搜索trigger 找到该选项 xff0c 更改快捷键 2 当鼠标悬停在枚举值上 xff0c 不能显示当前序号 a 打开setting j
  • 用Keil编译C51和ARM时,分别生成.Bin文件的方法

    一 C51 1 使用srec cat exe a Keil工程需生成 hex文件 b 将srec cat exe放在工程路径中任意文件夹下 c 新建一个文本文档 xff0c 之后填写如下内容 xff0c 保存后更名为 1 bat xff08
  • Keil新建Stm32标准工程中 Preprocessor Symbols的作用

    xff08 转自正点原子的回复 xff09 标准的工程新建办法 是要添加 34 USE STDPERIPH DRIVER STM32F10X HD的 USE STDPERIPH DRIVER 是告诉编译器 我们需要使用标准库了 实际上是 c
  • 单片机中利用Union联合体打印输出浮点数(小数)

    方法一 xff1a 指针 UART串口有一个缺点 xff0c 就是发送和接受是一个字节一个字节的接收 xff0c 如果发送的浮点数那可怎么办啊 xff1f 有人会说 xff0c 那就一个字节一个字节发送啊 那么 xff0c 我先定义一个do
  • 用 IAR 开发 STM8 时,简单软件延时不起作用的原因

    近期有幸接手了前任工程师遗留的项目 xff0c MCU 选择的是 STM8L151XX xff0c 开发工具使用的是 IAR 打开祖传代码后 xff0c 通读了一遍 xff0c 就用ST Link烧录进去跑程序 xff0c 结果发现和预想的
  • 基于SX1276芯片的 LORA 技术开发详解

    一 简介 LORA xff0c 是 Long Range 的简称 LORA 技术 xff0c 源自于美国的升特公司 xff08 Semtech xff09 xff0c 是一种用于中 长距离传输的技术 xff0c 相关信息主要从升特公司官网获
  • Linux下用C语言将一个字符串格式(char*)的MAC地址转换为十六进制数组

    include lt stdio h gt include lt stdlib h gt unsigned char a2x const char c switch c case 39 0 39 39 9 39 return unsigne
  • 超声波换能器的主要参数解读,全!

    1 导纳是阻抗的倒数 xff0c 也就是一个代表困难程度的量 xff0c G为电导 xff0c B为电纳 导纳Y是一个复数 xff0c Y 61 G 43 jB xff1b 实部为电导 xff0c 虚部为电纳 G越大 xff0c 说明电荷越
  • 温度对超声波换能器的影响

    我们都知道超声波换能器的主要参数有 xff1a 谐振频率 反谐振频率 谐振阻抗 反谐振阻抗 输出幅值 静态电容等 在平时使用换能器的时候 xff0c 除了超声波换能器有自身损耗的影响外 xff0c 很可能使用场合出现在室内或室外 xff0c
  • RC522模块学习

    目录 1 原理简介 2 SPI通信 3 获取卡号实验 3 驱动函数 参考 xff1a https www cnblogs com ivantang p 3904025 html https xiaolong blog csdn net ar
  • 从零学习GCC,Makefile,CMakeList编译

    近期想系统地学习一下C 43 43 软件开发 xff0c 因此记录一下自己的学习笔记 xff0c 方便复习 大多数内容都是整理搬运别的博主文章内容 xff0c 加上自己的理解归纳 如果大家想了解更深的内容或者有不明白的地方 xff0c 可以

随机推荐

  • AS608指纹模块

    目录 1 简介 2 上位机测试 3 stm32程序 1 简介 AS608指纹识别模块是一款高性能的光学指纹识别模块 模块配备了串口 USB通讯接口 xff0c 用户无需研究复杂的图像处理及指纹识别算法 xff0c 只需通过简单的串口 USB
  • 两个hc05蓝牙模块在两块单片机上通信(附完整代码)

    目录 第一步 xff1a 进入AT模式 第二步 xff1a 同时插在电脑上实现通信 第三步 xff1a 单片机上通信 代码链接 所需材料 xff1a 两个hc05蓝牙 xff0c 两个usb转串口模块 xff0c 两块单片机 第一步 xff
  • 代码随想录day2 leetcode977,209,59,54

    977 有序数组的平方 class Solution public vector lt int gt sortedSquares vector lt int gt amp nums vector lt int gt res nums siz
  • 代码随想录day3 leetcode203,707,206,剑指offer 76题,62题

    链表基础知识 单链表的定义 单链表 struct ListNode int val 节点上存储的元素 ListNode next 指向下一个节点的指针 ListNode int x val x next NULL 节点的构造函数 不定义构造
  • 代码随想录day4 leetcode24,19,02.07面试题,142,138

    感觉链表最难的就是处理越界问题 24 两两交换链表中的节点 class Solution public 链表题很容易出现段错误 xff0c 一定要注意判断是否为空 ListNode swapPairs ListNode head ListN
  • http协议分析软件-Fiddler 教程

    Fiddler是最强大最好用的Web调试工具之一 xff0c 它能记录所有客户端和服务器的http和https请求 xff0c 允许你监视 xff0c 设置断点 xff0c 甚至修改输入输出数据 使用Fiddler无论对开发还是测试来说 x
  • STM32寄存器开发以及库函数开发的区别,库函数基础工程创建以及源文件和头文件的作用,手把手教你创建第一个STM32的LL库开发的工程

    一 序 本文主要是简述如何创建一个STM32的基础工程 xff0c 以及在工程文件中所添加文件 xff08 头文件以及原文件 xff09 的意义 本文不使用RTE xff0c 使用的芯片为STM32F103ZET6 xff0c KEIL x
  • C++ 万能库文件

    大家是不是通常使用 lt iostream gt 这个库文件呢 xff1f 有时用到了其他代码动不动就来个 error xff0c 非常麻烦对吧 xff0c 今天告诉大家一个万能库 xff0c 包含了c 43 43 大多数库 xff0c 那
  • 三维模型转变为点云模型的好工具——CloudCompare使用小记

    普通三维模型能够直观地展示物体的三维全貌 xff0c 但是在一些场合需要将三维模型变为相应的点云模型进行展示 xff0c 而使用激光雷达等传感器采集到的点云信息往往只能反应模型表面的情况 xff0c 或是使用PCL库中的可执行文件进行转换
  • MyString(字符串类)实现

    字符串类 xff08 MyString xff09 说明文档 一 MyString 类的组成 1 1 私有成员 char data 字符型指针 int length 整型字符串长度 1 2 共有成员 1 2 1 构造与析构函数 MyStri
  • ROMFS的建立

    参考 xff1a VxWorks 7 File Systems Programmer s Guide
  • MyMatrix(二维矩阵类)实现

    二维矩阵类 xff08 MyMatrix xff09 说明文档 一 MyMatrix 类的组成 1 1 私有成员 int row 二维矩阵行数 int col 二维矩阵列数 T data 二维矩阵数据 1 2 共有成员 1 2 1 构造与析
  • 基于CUDA和TCP通信的大数据双机加速计算(CUDA加速、内存优化、TCP多机协同)

    1 环境 技术简介 1 1 程序运行环境 1 server端计算机 操作系统 xff1a Ubuntu 18 04 5 LTS 运行环境 xff1a VSCode或Bash终端 2 client端计算机 操作系统 xff1a Ubuntu
  • RGB888转换为RGB565格式

    RGB888转换为RGB565格式 RGB888用unsigned int 32位字节存储 00000000R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2
  • Keil5界面配置

    配置一 xff1a 绿色 Specification for text selection and caret line selection fore 61 00FFFF selection back 61 004000 caret for
  • Linux内核调试环境(centos+gdb+qemu)

    一 写在前面 主要介绍qemu在Centos中的安装过程 xff0c 以及遇到的一些麻烦 网上教程好多都是在Ubuntu环境下的安装 xff0c 但是公司给的环境大都是Centos xff0c 没办法花了一天的时间 xff0c 磕磕绊绊弄好
  • Linux中修改系统启动项grub

    在修改grub时看到很多资料 xff0c 上来就是直接修改 etc default grub配置文件中的GRUB DEFAULT配置项 xff0c 但是有时候修改不成功 xff0c 本文简单说明一下修改的原理 注 xff1a 根据本人机器上
  • C语言调用cJSON库解析json

    一 源代码文件下载 自己使用时可以只需要其中的cJSON c和cJSON h文件就可以了 xff0c 只需要将cJSON和自己的main文件一起编译即可 下载地址 xff1a cJSONFiles zip 互联网文档类资源 CSDN下载 二
  • Java学习记录 (一)

    使用 BufferedReader 按行读入文档内容 InputStream input file span class token operator 61 span null span class token punctuation sp
  • cmake学习5:如何将自己的库作为第三方库给别人使用

    前言 自己在使用cmake进行编译工程的时候不太了解cmake的基本使用方法 有时候出现找不到第三方库的问题也不知如何排查 因此相对cmake有个稍微系统的认识 希望能用这个强大的工具来更好的为自己的工程服务 因此总结为了几篇博客 主要参考