下面简单介绍Cmake 如何使用find_package命令对外部库进行查找:

cmake本身不提供任何关于搜索库的便捷方法,也不会对库本身的环境变量进行设置。它仅仅是按照优先级顺序在指定的搜索路径进行查找Findxxx.cmake文件和xxxConfig.cmake文件(其中xxx代表库的名字,特别注意的是有大小写之分),这两个文件大体上是没有区别的,cmake能够找到这两个文件中的任何一个,我们都能成功使用该库,也就是我们可以用库的内置好了Cmake变量。包含了库的头文件和库文件的路径信息,虽然库的作者一般会提供这两个文件,但是也会遇到安装完毕后找不到的情况。当我们在cmake..命令之后,Cmake 会读取执行CMakeLists.txt中的代码,当执行find_package()这条命令后,Cmake 就会从某些路径中找这Findxxx.cmake文件或者xxxConfig.cmake文件,Cmake找到任意一个之后就会执行这个文件,然后这个文件执行后就会设置好一些Cmake变量。比如下面的变量(NAME表示库的名字 比如可以用Opencv 代表Opencv库):

<NAME>_FOUND
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS

一般常用的就是xxx_FOUND 、xxx_INCLUDE_DIRS、xxx_LIBS,分别代表是否找到库的标志、库的头文件路径、库文件路径。find_package()有两种模式:Module模式和Config模式,分别对应上面的Findxxx.cmake 和xxxConfig.cmake两个文件。cmake默认优先Module模式,而Config模式是备选项。

Module模式(仅仅查找Findxxx.cmake文件):
Cmake会优先搜索CMAKE_MODULE_PATH指定的路径,如果在CMakeLists.txt中没有设置CMAKE_MODULE_PATH为存储Findxxx.cmake的路径,也就是说没有下面的指令:
set(CMAKE_MODULE_PATH "Findxxx.cmake文件所在的路径")
那么Cmake不会搜索CMAKE_MODULE_PATH指定的路径,此时Cmake会搜索第二优先级的路径,也就是<CMAKE_ROOT>/share/cmake-x.y/Mdodules (注意:x.y表示版本号。我的是3.10)。其中CMAKE_ROOT是你在安装Cmake的时候的系统路径,因为我并没有指定安装路径,所以是系统默认的路径,在我的系统中(ubuntu16.04)系统的默认路径是/usr/loacl,如果你在安装的过程中使用了
cmake -DCMAKE_INSTALL_PREFIX=自己dir路径 ,那么此时CMAKE_ROOT就代表那个你写入的路径 。刚刚说道第一优先级的路径搜索没有找到Findxxx.cmake文件,就会到第二优先级的路径下搜索。如果Cmake在两个路径下都没有找到Findxxx.cmake文件。那么Cmake就会进入Config模式。

Config模式(仅仅查找xxxConfig.cmake文件):
Cmake会优先搜索xxx_DIR 指定的路径。如果在CMakeLists.txt中没有设置这个cmake变量。也就是说没有下面的指令:
set(xxx_DIR "xxxConfig.cmkae文件所在的路径")
那么Cmake就不会搜索xxx_DIR指定的路径,此时Cmake 就会自动到第二优先级的路径下搜索,也就是/usr/local/lib/cmake/xxx/中的xxxConfig.cmake文件。
上面主要讲了Cmake的搜索模式。如果Cmake在两种模式提供的路径中没有找到对应的Findxxx.cmake和xxxConfig.cmake文件,此时系统就会提示最上面的那些错误信息。

现以but_velodyne package查找为例:

find_package(but_velodyne REQUIRED)

现在查找到: /usr/local/lib/cmake/but_velodyne-0.1/but_velodyne-config.cmake

cat but_velodyne-config.cmake:

# Users can set the following variables before calling the module:
# ButVELODYNE_DIR - The preferred installation prefix for searching for ButVELODYNE. Set by the user.
#
# ButVELODYNE_ROOT_DIR - the root directory where the installation can be found
# ButVELODYNE_CXX_FLAGS - extra flags for compilation
# ButVELODYNE_LINK_FLAGS - extra flags for linking
# ButVELODYNE_INCLUDE_DIRS - include directories
# ButVELODYNE_LIBRARY_DIRS - link directories
# ButVELODYNE_LIBRARIES - libraries to link plugins with
# ButVELODYNE_Boost_VERSION - the boost version but_velodyne was compiled withget_filename_component(_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_PREFIX "${_PREFIX}" PATH)
get_filename_component(_PREFIX "${_PREFIX}" PATH)
get_filename_component(ButVELODYNE_ROOT_DIR "${_PREFIX}" PATH)set( ButVELODYNE_CXX_FLAGS "-DBUT_VELODYNE_DLL  " )
set( ButVELODYNE_LINK_FLAGS "" )
set( ButVELODYNE_INCLUDE_DIRS "${ButVELODYNE_ROOT_DIR}/include/but_velodyne-0.1")
set( ButVELODYNE_LIBRARY_DIRS "${ButVELODYNE_ROOT_DIR}/lib")
set( ButVELODYNE_LIBRARIES but_velodyne${ButVELODYNE_LIBRARY_SUFFIX})set( ButVELODYNE_Boost_VERSION "1.58")mark_as_advanced(ButVELODYNE_ROOT_DIRButVELODYNE_CXXFLAGSButVELODYNE_CXX_FLAGSButVELODYNE_LINK_FLAGSButVELODYNE_INCLUDE_DIRSButVELODYNE_LIBRARIESButVELODYNE_Boost_VERSION
)

如何查看find_package()的结果:

find_package(but_velodyne REQUIRED)
if (but_velodyne_FOUND)MESSAGE (STATUS "@@@@@@dern: ${ButVELODYNE_DEFINITIONS}")MESSAGE (STATUS "@@@@@@dern: ${ButVELODYNE_INCLUDE_DIRS}")MESSAGE (STATUS "@@@@@@dern: ${ButVELODYNE_LIBRARY_DIRS}")
else()MESSAGE (STATUS "@@@@@@dern: but_velodyne not found")
endif(but_velodyne_FOUND)

输出:


OpenCV


安装在opt的文件中会有share文件夹,这里面就有咱们需要的OpenCV文件夹,所以如果要自己有选择的控制版本,则在find_package这句话前面去设置opencv的OpenCV文件夹在哪里,添加set(OpenCV_DIR /opt/opencv-2.4.11/share/OpenCV)这句话。这个可以根据你install的位置去变化。

————————————————
版权声明:本文为CSDN博主「AndyCheng_hgcc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengde6896383/article/details/86497016

cmake find_package 原理简介以及使用说明相关推荐

  1. cmake find_package路径详解

    cmake find_package路径详解 转自:https://zhuanlan.zhihu.com/p/50829542 经常在Linux下面写C++程序,尤其是需要集成各种第三方库的工程,肯定 ...

  2. javascript原理_JavaScript程序包管理器工作原理简介

    javascript原理 by Shubheksha 通过Shubheksha JavaScript程序包管理器工作原理简介 (An introduction to how JavaScript pa ...

  3. Nginx 反向代理工作原理简介与配置详解

    Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...

  4. DeepLearning tutorial(1)Softmax回归原理简介+代码详解

    FROM: http://blog.csdn.net/u012162613/article/details/43157801 DeepLearning tutorial(1)Softmax回归原理简介 ...

  5. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    FROM:http://blog.csdn.net/u012162613/article/details/43221829 @author:wepon @blog:http://blog.csdn.n ...

  6. DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

    FROM: http://blog.csdn.net/u012162613/article/details/43225445 DeepLearning tutorial(4)CNN卷积神经网络原理简介 ...

  7. 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )

    文章目录 一.主线程中的 Handler 与 Looper 二.Handler 原理简介 一.主线程中的 Handler 与 Looper Android 系统中 , 点击图标启动一个应用进程 , 就 ...

  8. 量子计算机编程原理简介 和 机器学习

    量子计算机编程原理简介 和 机器学习 本文翻译自D-Wave公司网站 www.dwavesys.com/en/dev-tutorial-intro.html D-wave公司在2007年就声称实现了1 ...

  9. DL之CNN:卷积神经网络算法简介之原理简介——CNN网络的3D可视化(LeNet-5为例可视化)

    DL之CNN:卷积神经网络算法简介之原理简介--CNN网络的3D可视化(LeNet-5为例可视化) CNN网络的3D可视化 3D可视化地址:http://scs.ryerson.ca/~aharley ...

  10. DL之CNN:卷积神经网络算法简介之原理简介(步幅/填充/特征图)、七大层级结构(动态图详解卷积/池化+方块法理解卷积运算)、CNN各层作用及其可视化等之详细攻略

    DL之CNN:卷积神经网络算法简介之原理简介(步幅/填充/特征图).七大层级结构(动态图详解卷积/池化+方块法理解卷积运算).CNN各层作用及其可视化等之详细攻略 目录 CNN 的层级结构及相关概念 ...

最新文章

  1. nginx 操作笔记
  2. kafka配置参数详解
  3. 51Nod --1133 不重叠的线段
  4. 在Linux系统下安装gnuplot遇到的问题
  5. 前端学习(1178):vue基础
  6. 编译安装sqlite-3.6.20【原创】
  7. ASP.NET性能监控和优化入门
  8. PHP实反向代理-收藏
  9. Kafka Streams简介: 让流处理变得更简单
  10. 【前端 · 面试 】JavaScript 之你不一定会的基础题(二)
  11. python查找客户总金额_如何使用python中的spark查找每个月的总金额
  12. 安卓微信本地数据库解密
  13. 百度拾取坐标系统平台根据点名获取坐标
  14. android音频系统简介
  15. Unity材质偏移(贴图纹理偏移)实现流动效果【记录一下】
  16. 【播放器】播放器对比
  17. 自定义打卡签到view
  18. win10任务管理器禁用_如何在Windows 10的文件资源管理器中禁用广告和通知
  19. 取模(取余)的具体含义
  20. 1.3 基于协同过滤的电影推荐案例

热门文章

  1. median _matlab 中值滤波函数
  2. (cf)Codeforces Round #807 (Div. 2)A--C思维题
  3. ios客户端发现_华为爱奇艺手机活动开发总结
  4. 电脑硬盘分区,新电脑只有C盘怎样分区
  5. matlab调整文字方向,python 旋转文字方向_如何通过Python 在绘图中旋转文字?
  6. Mysql 什么是聚集索引和非聚集索引?
  7. 重庆阿尔克分析2020中国经济,为什么实体经济干不过虚拟经济?
  8. 为什么双11快递一年比一年快?阿里新供应链架构解读
  9. (实测)天猫商城抢购茅台脚本
  10. 攻防比赛中蓝队常用的攻击方法