当前位置: 首页 > news >正文

cmake入门03 -自定义find外部库

自定义检测外部库

  • 使用pkg-config查找库
    • 搜索.pc配置文件
    • cmake函数
    • 链接到库
  • 自定义find库

检测外部库的便捷方法:

  • 使用CMake自带的find-module
  • 使用<package>Config.cmake, <package>ConfigVersion.cmake和<package>Targets.cmake。这些文件由软件商提供,并与软件包一起安装在标准位置的cmake文件夹下。

当某个库既没有find-module的查找模块,也软件商也不提供打包的cmake文件。

  • 使用pkg-config程序,来找系统上的包。这些依赖与软件供应商提供.pc配置文件,其中有关于发行包的元数据
  • 自己写find-package模块

使用pkg-config查找库

find_package(PkgConfig REQUIRED QUIET)#QUIET找不到库才报错

搜索.pc配置文件

通过使用PkgConfig库的pkg_search_module函数搜索附带 包配置.pc文件的库或程序。以ZeroMQ为例

apt-get install libzmq3-dev#安装zeroMQ库,该库没有提供findxxx.cmake文件

查看安装的内容

root@LAPTOP-Q8TAP9VQ:/usr# find -name "*zmq*"
./include/zmq.h
./include/zmq.hpp
./include/zmq_addon.hpp
./include/zmq_utils.h
./lib/x86_64-linux-gnu/libzmq.a
./lib/x86_64-linux-gnu/libzmq.so
./lib/x86_64-linux-gnu/libzmq.so.5
./lib/x86_64-linux-gnu/libzmq.so.5.2.4
./lib/x86_64-linux-gnu/pkgconfig/libzmq.pc

存在.pc文件,可以使用config模式进行查找库

pkg_search_module(ZeroMQREQUIREDlibzeromq libzmq lib0mqIMPORTED_TARGET)

其中libzeromq libzmq lib0mq是ZeroMQ库在不同操作系统和包管理器中的不同名称。如此设置可以根据操作系统和包管理器的统统,为同一个包选择同一个名称。

cmake函数

当找到pkg-config时, CMake需要提供两个函数,来封装这个程序提供的功能:

  • pkg_check_modules,查找传递列表中的所有模块(库和/或程序)
  • pkg_search_module,要在传递的列表中找到第一个工作模块

链接到库

target_link_libraries(targetName PkgConfig::ZeroMQ)

自定义find库

自己编写findxxx.cmake遵循以下步骤:

  1. 检查用户是否为所需要的包提供了自定义的位置
  2. 使用find_家族中的命令搜索所需包的必需组件:头文件,库,可执行程序等。
    • 使用find_path查找头文件完整路径
    • 使用find_library查找库
    • 其他还有find_file , find_program, find_package
  3. 如果搜索成功,将结果报错,如果搜索失败,则会设置为<var>-NOTFOUND。
  4. 初步搜索结果中,提取版本号。
  5. 调用调用find_package_handle_standard_args命令。处理find_package命令的REQUIRED、QUIET和版本参数,并设置xxx_FOUND变量

编写findxxx.cmake最主要的是查找到库文件的头文件路径和链接库路径。即lib和include路径。除非特定指定了版本,或者系统安装了多个版本的库,否则查找版本可以不用。(找到lib和include基本就能用了)

http://www.lryc.cn/news/30813.html

相关文章:

  • Dubbo源码解析-——服务导出
  • vue+django+neo4j 基于知识图谱红楼梦问答系统
  • 2023年全国最新食品安全管理员精选真题及答案13
  • Keychron K7 Pro 轻薄矮轴机械键盘开箱体验
  • 加油站ai视觉识别系统 yolov7
  • 【电子学会】2022年12月图形化二级 -- 绘制风车
  • 【golang/go语言】Go语言代码实践——高复用、易扩展性代码训练
  • [数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(学习复习笔记)
  • 05_Pulsar的主要组件介绍与命令使用、名称空间、Pulsar的topic相关操作、Pulsar Topic(主题)相关操作_高级操作、
  • 我的终端怎么莫名卡死了?shell下ctrl+s的含义
  • 【Vue】Vue的简单介绍与基本使用
  • 网络知识篇
  • python 连接数据库
  • 一文讲明白一致性hash算法
  • Java分布式解决方案(一)
  • 设备树系统学习(二)设备树的节点和属性
  • 【数据结构】二叉树的基本操作中的一些易错点
  • 在线图书借阅网站( Python +Vue 实现)
  • 不平衡数据集的建模的技巧和策略
  • 3. 算法效率
  • 仪表放大器放大倍数分析-运算放大器
  • laravel8多模块、多应用和多应用路由
  • 【Java学习笔记】6.Java 变量类型
  • Promise对象状态属性 工作流程 Promise对象的几个属性
  • webgpu思考obj携带属性
  • 设计模式(只谈理解,没有代码)
  • 06、Eclipse 中使用 SVN
  • Zookeeper3.5.7版本——客户端命令行操作(命令行语法)
  • 2023.03.05 学习周报
  • java Spring JdbcTemplate配合mysql实现数据批量修改