当前位置: 首页 > 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基本就能用了)

相关文章:

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

自定义检测外部库使用pkg-config查找库搜索.pc配置文件cmake函数链接到库自定义find库检测外部库的便捷方法&#xff1a;使用CMake自带的find-module使用<package>Config.cmake, <package>ConfigVersion.cmake和<package>Targets.cmake。这些文件由软件商提供…...

Dubbo源码解析-——服务导出

前言 在之前我们讲过Spring和Dubbo的集成&#xff0c;我们在服务上标注了DubboService的注解&#xff0c;然后最终Dubbo会调用到ServiceBean#export方法中&#xff0c;本次我们就来剖析下服务导出的全流程。 一、前置回顾 由于ServiceBean实现了ApplicationListener接口&…...

vue+django+neo4j 基于知识图谱红楼梦问答系统

vuedjangoneo4j 基于知识图谱红楼梦问答系统 项目背景 知识图谱是一种以图谱形式描述客观世界中存在的各种实体、概念及其关系的技术, 广泛应用于智能搜索、自动问答和决策支持等领域. 可视分析技术可以将抽象的知识图谱映射为图形元素, 帮助用户直观地感知和分析数据, 从而提…...

2023年全国最新食品安全管理员精选真题及答案13

百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 121.关于食品召回的说法&#xff0c;以下表述不正确的是&#xff08;&am…...

Keychron K7 Pro 轻薄矮轴机械键盘开箱体验

文章目录1. 拆箱2. 零件3. 外观4. 声音5. 特点5.1 有线 / 无线5.2 RGB背光5.3 轻薄5.4 mac / win / iphone 切换5.5 人体工程学支持5.6 扁平双射PBT键帽5.7 重新设计的稳定器5.8 扁平Gateron(佳达隆)轴体5.9 热插拔5.10 支持 QMK / VIA 改键6. 对比6.1 K7 与 K7 Pro 参数对比6.…...

加油站ai视觉识别系统 yolov7

加油站ai视觉识别系统通过yolov7网络模型深度学习&#xff0c;加油站ai视觉识别算法对现场画面中人员打电话抽烟等违规行为&#xff0c;还有现场出现明火烟雾等危险状态。除此之外&#xff0c;模型算法还可以对卸油时灭火器未正确摆放、人员离岗不在现场、卸油过程静电释放时间…...

【电子学会】2022年12月图形化二级 -- 绘制风车

绘制风车 1. 准备工作 &#xff08;1&#xff09;隐藏默认的小猫角色&#xff1b; &#xff08;2&#xff09;选择背景&#xff1a;“Xy-grid”。 2. 功能实现 &#xff08;1&#xff09;小猫角色的初始位置为(x:0,y:0)&#xff1b; &#xff08;2&#xff09;线条粗细为…...

【golang/go语言】Go语言代码实践——高复用、易扩展性代码训练

某个项目里有一段老代码写的不是很好&#xff0c;想着能否通过自己掌握的知识&#xff0c;将其改善一下。感兴趣的小伙伴可以通过了解背景和需求&#xff0c;自己试想下该如何实现&#xff0c;如果有更好的方案也欢迎留言讨论。 1. 背景及需求 (1) 背景 假设我们的下游提供了…...

[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(学习复习笔记)

1.1 数据结构的研究内容 计算机解决问题的步骤 从具体问题抽象出数学模型设计一个解此数学模型的算法编写程序&#xff0c;进行测试、调试&#xff0c;直到解决问题 计算机解决问题的过程中寻求数学模型的实质是 分析问题&#xff0c;从中提取操作的对象&#xff0c;并找出这些…...

05_Pulsar的主要组件介绍与命令使用、名称空间、Pulsar的topic相关操作、Pulsar Topic(主题)相关操作_高级操作、

1.5.Apache Pulsar的主要组件介绍与命令使用 1.5.1.多租户模式 1.5.1.1. 什么是多租户 1.5.1.2.Pulsar多租户的相关特征_安全性&#xff08;认证和授权&#xff09; 1.5.1.3.Pulsar多租户的相关特性_隔离性 1.5.1.4.Pulsar多租户的相关操作 1-获取租户列表 2-创建租户 3-获取配…...

我的终端怎么莫名卡死了?shell下ctrl+s的含义

在终端下面一不小心按下了ctrl s&#xff0c;整个终端就锁住了&#xff0c;不知道原油的同学可能会以为终端卡死了&#xff0c;找不到原因只好关闭终端重新打开&#xff0c;然后下意识还不忘吐槽一句&#xff0c;垃圾ubuntu&#xff0c;动不动卡死。 事实上ctrl s在终端下是…...

【Vue】Vue的简单介绍与基本使用

一、什么是VueVue是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。1.构建用户界面传统方…...

网络知识篇

网络知识篇 局域网 当多台计算机或设备通过同一物理或逻辑连接&#xff08;例如以太网或Wi-Fi网络&#xff09;连接在一起&#xff0c;并且它们可以相互通信时&#xff0c;就构成了一个局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;。 子网划分 为了更…...

python 连接数据库

文章目录同步操作同步连Mysql同步连redis同步连mongodb异步操作异步连mysql异步连redis异步连mongodb同步操作 同步连Mysql python 连接mysql可以使用pymysql、mysqlclient等。 安装&#xff1a; # win pip install pymysql 连接mysql: # __author__ "laufing"…...

一文讲明白一致性hash算法

一致性Hash算法常用来解决数据分片时的数据扩容/缩容的性能问题。 一、业内数据分片用的Hash算法&#xff0c;将节点的hash值对节点数取余。 存取通过key / value的方式对节点取余。 二、数据分片使用hash算法的优缺点&#xff1a; 优点&#xff1a;简单&#xff0c;方便。 缺…...

Java分布式解决方案(一)

随着互联网的不断发展&#xff0c;互联网企业的业务在飞速变化&#xff0c;推动着系统架构也在不断地发生变化。 如今微服务技术越来越成熟&#xff0c;很多企业都采用微服务架构来支撑内部及对外的业务&#xff0c;尤其是在高 并发大流量的电商业务场景下&#xff0c;微服务…...

设备树系统学习(二)设备树的节点和属性

一、节点 1.节点命名格式 格式:<name>[@<unit-address>] name:是一个简单的 ASCII 字符串,长度最多为 31 个字符,节节点是根据它所代表的设备类型来命名的,比如 “gpu” 就表示这个节点是 gpu外设。 unit-address:一般表示设备的地址或寄存器首地址,可以为…...

【数据结构】二叉树的基本操作中的一些易错点

文章目录前言一、求二叉树节点个数二、求树的叶子结点个数三、求树的高度四、二叉树查找值为x的结点总结前言 笔者整理出了一些关于萌新在入门二叉树时容易犯的一些错误&#xff0c;你也来试试自己会不会掉到这些坑里把~ 一、求二叉树节点个数 错误示例&#xff1a; int Tre…...

在线图书借阅网站( Python +Vue 实现)

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括&#xff1a;首页、图书详情页、用户中心模块。后台功能包括&#xff1a;总览、借阅管理、图书管理、分类…...

不平衡数据集的建模的技巧和策略

不平衡数据集是指一个类中的示例数量与另一类中的示例数量显著不同的情况。 例如在一个二元分类问题中&#xff0c;一个类只占总样本的一小部分&#xff0c;这被称为不平衡数据集。类不平衡会在构建机器学习模型时导致很多问题。不平衡数据集的主要问题之一是模型可能会偏向多数…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...