当前位置: 首页 > 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;这被称为不平衡数据集。类不平衡会在构建机器学习模型时导致很多问题。不平衡数据集的主要问题之一是模型可能会偏向多数…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...

WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署

一、Hardhat / Foundry 进行合约部署 概念介绍 Hardhat 和 Foundry 都是以太坊智能合约开发的工具套件&#xff0c;支持合约的编译、测试和部署。 它们允许开发者在本地或测试网络快速开发智能合约&#xff0c;并部署到链上&#xff08;测试网或主网&#xff09;。 部署过程…...