cmake(三十二)Cmake之find_package指令

2023-11-17

一    cmake帮助文档

find_package命令详解

1)  --help-command-list        cmake'内置命令'列表

2)  --help-comamnd <command>   command帮助文档

3)  --help-variable-list       完整CMAKE'内置变量'列表

4)  --help-module-list         现有的'模块'列表 -->'重点'

二    find_package语法

FIND_PACKAGE 命令用于'搜索'并加载'外部工程',其'隐含的变量'用于'标识'是否'搜索'到所需的'package_name'

(1)   Module模式的解读

cmake3 --help-command find_package  -->'find_package'的帮助文档

注意: 'Module'模式中 'REQUIRED'、COMPONENTS、EXACT、'QUIET'字段的解读

备注: 'MODULE'强制使用'module'模式,也即'module'找不到,则'error报错'

①     Module模式可用属性 

备注: 'Component'如何'理解'?

②    Module模式是如何查找指定package

备注: 'Centos7.7'cmake默认是'没有'这个变量的

③    继续解读

Module模式:搜索'CMAKE_MODULE_PATH'指定路径下的'FindXXX.cmake'文件,'执行该文件'从而'找到XXX库'

备注: 具体'查找库'并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个'变量赋值的操作'由FindXXX.cmake模块完成

++++++++++++++'CMAKE_MODULE_PATH'指定的路径++++++++++++++

1)<CMAKE_ROOT>/share/cmake-x/Mdodules 

备注1:x表示'大'版本号,centos7中如果是'2.x.x'系列,则不指定;'3.x.x'系列指定为'3'

++++++++++++++'CMAKE_ROOT'的路径++++++++++++++

1)其中'CMAKE_ROOT'是你在'安装cmake'的时候的'系统路径'

2)如果'没有指定'安装路径,则是'系统默认'的路径,在我的系统中(Centos7.7)系统的默认路径是'/usr/local'

3)如果你在安装的过程中使用了'cmake -DCMAKE_INSTALL_PREFIX=自己dir路径' ,那么此时'CMAKE_ROOT'就代表那个你'写入'的路径 

备注: '$CMAKE_ROOT'的具体值可以通过CMake中'message命令'输出

小结: 这称为'模块(Module)'模式,也是'默认'的模式

++++++++++++++'实践'++++++++++++++

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

说明: 基于'原来的','添加'一个'查找'路径-->'列表'

④  实践

C++ CMake 使用 Python3

1)指令如下

find_package(Python3 COMPONENTS Interpreter REQUIRED)

2)查找顺序

说明:没有哪个属性表明是'强制使用Config',所以优先'Module'模式,查找'FindPython3.cmake'文件,由于'没有定义CMAKE_MODULE_PATH',所以会从'系统/usr/share/camke3/Modules/'中查找

3)查看该cmake文件

内置'一些'变量:'Python3_FOUND'、'Python3_EXECUTABLE'

说明: 分为'两部分',一部分是'帮助文档(细细的阅读)',一部份是'cmake命令'

4)测试

<Package>_FOUND -->'属性'

(2)Config模式

①     Config模式可用属性 

取反: 不指定"CONFIG",不指定"NO_MODULE",也不使用"full signature"中的关键字,那就是在'Module'模式

②    Config模式是如何查找指定package

Config模式:搜索'XXX_DIR'指定路径下的'XXXConfig.cmake'文件,'执行'该文件从而'找到'XXX库

备注: 其中具体查找库'并给XXX_INCLUDE_DIRS'和'XXX_LIBRARIES'两个变量'赋值的操作'由'XXXConfig.cmake'模块完成

+++++++++++Config '搜索路径'+++++++++++

1)搜索xxx_DIR '指定'的路径

2)如果在CMakeLists.txt中'没有设置'这个cmake变量,也就是说'没有下面的指令': 

    set(xxx_DIR "xxxConfig.cmkae文件所在的路径")那么Cmake'就不会搜索'xxx_DIR指定的路径

3)Cmake 会在'/usr/local/lib/cmake/xxx/'、 '/usr/local/share/xxx' 中的xxxConfig.cmake文件

备注: 这个路径'不同的操作系统'存在差异,当前'Centos7.7'是'/usr/share/cmake{,3}/Modules/'

③    继续解读

④    实践

场景: 由于Caffe安装时'没有安装'到系统目录,因此'无法自动找到'CaffeConfig.cmake,在'CMakeLists.txt'最前面'添加了一句话'之后就可以了

+++++++++++++++++++'配置步骤'+++++++++++++++++++

(1)'添加'CaffeConfig.cmake的搜索路径

set(Caffe_DIR /home/wzj/projects/caffe/build)

(2)查找'Caffe'模块

find_package(Caffe REQUIRED)

指令含义: 表示此包是'必须的(required)',如果'没有找到',构建程序'报错'并'终止'

首先:采用默认的'Module'模式,在'CMAKE_MODULE_PATH'中寻找'FindCaffee.cmake'文件,没有找到,则转下

然后:采用'Config'模式,在上面定义的'Caffe_DIR'路径中,搜索'CaffeConfig.cmkae文件'

备注:这里假设'Config'模式

(3)模块'是否'找到 -->'包状态变量判断'

if(NOT Caffe_FOUND)
  message(FATAL_ERROR"Caffe Not Found!")
endif(NOT Caffe_FOUND)

(4)找到则'加入''include_directories'目录

include_directories(${Caffe_INCLUDE_DIRS})

add_executable(useSSD ssd_detect.cpp)

target_link_libraries(useSSD${Caffe_LIBRARIES})

(3)小结

find_package与CMake如何查找链接库详解

1)cmake'默认'采取'Module'模式

2)如果Module模式'未找到'库,才会'采取Config'模式

也即:如果在Module的搜索路径'中没有找到'对应的'cmake file',则使用config模式

3)总之,Config模式是一个'备选策略'

补充:通常'库安装时'会拷贝一份'XXXConfig.cmake'到'系统'目录中,因此在'没有显式'指定'搜索路径时'也可以顺利'找到'

参考博客

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

cmake(三十二)Cmake之find_package指令 的相关文章

  • SHA-256算法实现过程

    整理一下SHA 256的实现步骤 1 定义8个32位常量 h0 0x6a09e667 h1 0xbb67ae85 h2 0x3c6ef372 h3 0xa54ff53a h4 0x510e527f h5 0x9b05688c h6 0x1f
  • 通过Java理解Kruskal算法

    今天 我将解析一段Java代码 该代码实现了Kruskal算法 用于在连通的无向图中找到最小生成树 首先 我们来了解一些关键组件 1 DisjointSet 不相交集 这是Kruskal算法中的辅助数据结构 用于管理不相交集的集合 Find
  • msvcr100.dll丢失的解决方法?三招解决msvcr100.dll丢失问题

    最近我遇到了一个电脑问题 就是在运行某个软件时提示缺少msvcr100 dll文件 起初我并不知道这个文件是什么 也不知道它的作用 但通过一番搜索和了解 我对这个问题有了更深的理解 并且也得到了解决的办法 解决方法一 确保你的两台电脑都是相
  • requests_模拟搜狗翻译

    01笔记 在搜狗翻译的url中 请求的方法是Post 所以我们需要通过requests post方法来请求数据 接着url的请求参数是一个字典 所以我们需要修改该字典参数的搜索关键词 且其他参数需复制请求 否则请求不到数据 最后该url返回
  • PyTorch 2.0来了!100%向后兼容,一行代码训练提速76%

    编辑 机器之心 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 PyTorch 官方 我们这次的新特性太好用了 所以就直接叫 2 0 了 前段时间 PyTorch 团队在官
  • Altium Designer-Net has no driving source警告消除的方法

    1 其实这个警告原因是 你图中有一个器件的管脚有属性 如I O 并且这个管脚设定了驱动源 你先从元件库中 找到这个管脚 把管脚的属性 改成下面图片 的这个样子 就好了 2 下面这种方法 只是快速 逃避警告 也是可以通过编译的 在进行原理图编
  • 爬取豆瓣电影数据并进行分析可视化

    学习爬虫爬取豆瓣电影数据并进行分析 整体流程如下 1 爬取豆瓣电影数据 2 读取豆瓣电影数据 3 统计各个电影的评论数 4 读取某个电影的全部评论内容 5 获取某个电影的关键词并生成词云图 6 对电影数据的关键词和评分进行辩证分析并生成热力
  • linux设备号

    什么是设备号 linux中设备号是用来标记一类设备以及区分这类设备中具体个体的一组号码 由主设备号和次设备号组成 主设备号用来标记设备的类型 次设备号用来区分在这类设备中具体的个体设备 为什么用设备号 我们知道 linux下一切皆文件 li
  • CentOS 8.5:mysql8 + php8 使用 phpmyadmin52

    使用 dnf 安装命令没有安装成功 下载安装 phpmyadmin 下载地址 最新版本为 5 2 phpMyAdmin Downloads etc nginx nginx conf 中的配置内容 server listen 80 liste
  • VS Code的神级插件Bito - GPT-4 和 ChatGPT 编写代码、解释代码、创建测试

    Bito是什么 Bito是一款插件 它目前支持VS Code Chrome插件 以及Jetbrains的全系列IDE 例如 IDEA PyCharm Clion等 可以说能够覆盖大部分开发同学了 Bito 通过将 GPT 4 和 ChatG
  • KMP算法理解

    学习了KMP算法 对此有了一些理解 通过博客分享 如有理解错误的地方 请纠正 文章目录 字符串的前缀后缀 最大公共长度数组获取 KMP算法 时间复杂度 字符串的前缀后缀 再说明KMP算法前见说下它用到的一些东西 给定一个字符串如 ABCDA
  • 1.机器学习的基础概念

    机器学习的基础概念 文章目录 机器学习的基础概念 机器学习的分类 一 监督学习 1 监督学习概念 2 监督学习流程 3 监督学习算法 二 无监督学习 1 无监督学习概念 2 无监督学习流程 3 无监督学习算法 总结 机器学习的分类 机器学习
  • python 博弈论 库_6个Python库解释机器学习模型并建立信任

    原标题 6个Python库解释机器学习模型并建立信任 在机器学习模型中建立信任的案例 全球道路上大约有12亿辆汽车 这是一个令人毛骨悚然的问题 您认为实际上有多少驾驶员了解车辆的内部运行情况 您可能已经猜到了 答案只是少数几个人 我们不需要
  • 拿金币 蓝桥杯

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • LINUX IO内存操作方法

    https wenku baidu com view f15358692bf90242a8956bec0975f46527d3a7f3 html
  • 快看!那个学vSLAM的上吊了! —— (一)综述

    不同于之前发布的文章 我将使用一种全新的方式 iPad Notability Blog的方式打开这个板块的大门 原因有两个 1 Notability更方便手写长公式 也方便手绘坐标系变换等等 2 之前Apple Pencil找不到了新破费买
  • Qt5.9中一个槽函数接收多个信号用法(函数sender())

    本文主要总结一种常用情况 当多个信号同时发送到一个槽函数时 需要在槽函数中判断 是哪个信号发射过来的 解决这个问题 主要用到函数 QObject sender 和QString sender objectName QObject sende

随机推荐

  • devops-部署web服务器环境

    1 java 环境 各 wenb 服务器准备 tomcat 运行环境 useradd www u 2000 mkdir apps cd apps tar xvfjdk 8u181 linux x64 tar gz ln sv apps jd
  • 手把手教你使用 Prometheus 监控 JVM

    概述 当你的 Java 业务容器化上 K8S 后 如果对其进行监控呢 Prometheus 社区开发了 JMX Exporter 来导出 JVM 的监控指标 以便使用 Prometheus 来采集监控数据 本文将介绍如何利用 Prometh
  • 如何保证同事的代码不会腐烂?一文带你了解 Alibaba COLA 架构

    本文开始前 问大家一个问题 你觉得一份业务代码 尤其是互联网业务代码 都有哪些特点 我能想到的有这几点 互联网业务迭代快 工期紧 导致代码结构混乱 几乎没有代码注释和文档 互联网人员变动频繁 很容易接手别人的老项目 新人根本没时间吃透代码结
  • 帝国霸业服务器无限加载,帝国霸业银河生存控制台有哪些指令 控制台指令一览...

    游戏里面能够开启控制面板键入命令 在网络服务器中一样还可以 但是很有可能许多游戏玩家不清楚命令编码 下边大家就为大伙儿产生帝国霸业星空存活网络服务器有什么命令的详细介绍 有必须的游戏玩家快看来一下吧 游戏里面能够开启控制面板键入命令 在网络
  • docker中的zookeeper安装、连接及常见命令

    一 docker安装 1 搜索一下Zookeeper镜像 这一步可以省略 docker search zookeeper 2 从Docker上下载zookeeper docker pull zookeeper 3 启动Zookeeper镜像
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 微信小程序开发-AppID申请

    开始 开发小程序的第一步 你需要拥有一个小程序帐号 通过这个帐号你就可以管理你的小程序 跟随这个教程 开始你的小程序之旅吧 申请帐号 进入小程序注册页 根据指引填写信息和提交相应的资料 就可以拥有自己的小程序帐号 在这个小程序管理平台 你可
  • TortoiseSVN 日常操作指南

    原文地址 http blog csdn net happy4nothing article details 376604 Toc101751879 TortoiseSVN A Subversion client for Windows St
  • Oracle中如何获取系统当前时间

    select to char sysdate yyyy mm dd hh24 mi ss from dual ORACLE里获取一个时间的年 季 月 周 日的函数 select to char sysdate yyyy from dual
  • 解决Visual Studio Code点击运行出现无法访问此网站

    1 访问后的网页 2 经过检查发现里面多出一个文件 vscode gt launch json 可能是你在运行时打开的窗口有 css文件 这是我猜的 3 把多出的文件夹删除掉 Vscode launch json 把刚才拒绝访问的网页关闭掉
  • 6、USRP【入门软件无线电(SDR)】PySDR:使用 Python 的 SDR 和 DSP 指南

    因为设备不同 本教程未实测 仅作为USRP参考 在本章中 我们将学习如何使用UHD Python API通过USRP控制和接收 传输信号 USRP是由Ettus Research 现为NI的一部分 制造的一系列SDR 我们将讨论 Pytho
  • Gbps/KW

    Gbps 衡量交换机的数据交换能力 传输速度为每秒1000兆位 即1Gbps
  • node封装传formdata数据的接口(多文件上传)

    前文 这个星期的主要完成的东西我想就是多文件上传了 这也是我第一次封装传formdata数据类型的数据 因为也是刚学不久node 很多东西都是要自己摸索的 关于这个多文件上传我也是查阅了不少的博客 也是问了学长 最后问题才得以解决 关于接口
  • 企业性能测试成熟度

    影响性能测试成熟度的5个内容项 1 性能测试流程规范 性能需求型模式 测试执行启动基本无规划 缺少标准流程规范 测试资产无法复用 测试结果无总结和沉淀性能常态化模式下流程规范 gt 企业内部不同部门 各个团队共同制定并执行达成一致的性能测试
  • 两数之和 暴力美学 哈希表

    1 两数之和 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 的那 两个 整数 并返回它们的数组下标 leetcode 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出
  • 常见模拟电路设计 一(含仿真):方波、三角波、正弦波的互相发生

    FPGA最近有些整累了 给大家开个模拟电路设计的坑 内含干货 请放心食用 一 总体设计方案 二 单元电路设计和原理说明 2 1方波发生电路 波形发生电路可以由集成运放芯片构成运算电路来实现 第一步的方波发生电路 可以由滞回比较器和RC电路构
  • midjourney上线slack,国内也能用上啦!mjslackbot

    Mjslackbot 国内免费免魔法的原版midjourney 跟discord上的操作一模一样 在频道中描述你的关键词 既可生成精美的图案 手把手教学 1 注册Slack https slack com intl zh cn 注册成功后会
  • 解决word页码混乱并使页码从指定页开始

    解决word页码混乱并使页码从指定页开始 1 解决word页码混乱 页码混乱是由于误加了分节符导致的结果 导致页码不按照物理顺序排序 因此 我们在大纲模式下删除所有分节符 重排页码 2 从指定页重排页码 在指定页页眉位置点击布局 选择分隔符
  • Kafka3.0.0版本——消费者(消费者组案例)

    目录 一 消费者组案例 1 1 案例需求 1 2 案例代码 1 2 1 消费者1代码 1 2 2 消费者2代码 1 2 3 消费者3代码 1 2 4 生产者代码 1 3 测试 一 消费者组案例 1 1 案例需求 测试同一个主题的分区数据 只
  • cmake(三十二)Cmake之find_package指令

    一 cmake帮助文档 find package命令详解 1 help command list cmake 内置命令 列表 2 help comamnd