• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

解决CMake时的Find_Package失败问题

武飞扬头像
土豆西瓜大芝麻
帮助1

今天在编译组内代码时遇到了Find_package问题,具体来说就是找不到redis的库及相关头文件。

  1.  
    CMake Error at cmake/micros.cmake:75 (find_package):
  2.  
    By not providing "Findclass_loader.cmake" in CMAKE_MODULE_PATH this project
  3.  
    has asked CMake to find a package configuration file provided by
  4.  
    "class_loader", but CMake did not find one.
  5.  
     
  6.  
    Could not find a package configuration file provided by "class_loader" with
  7.  
    any of the following names:
  8.  
     
  9.  
    class_loaderConfig.cmake
  10.  
    class_loader-config.cmake
  11.  
     
  12.  
    Add the installation prefix of "class_loader" to CMAKE_PREFIX_PATH or set
  13.  
    "class_loader_DIR" to a directory containing one of the above files. If
  14.  
    "class_loader" provides a separate development package or SDK, be sure it
  15.  
    has been installed.
学新通

 针对上述问题,我们查找并安装了class_loader的开发库,上述问题就解决了。也就是

  1.  
    ok@u20:~/code/micros_information-dev_v2/build$ sudo apt-cache search class_loader
  2.  
    libclass-loader-dev - development files for Robot OS class_loader library
  3.  
    libclass-loader1d - ROS class_loader library
  4.  
    ok@u20:~/code/micros_information-dev_v2/build$ sudo apt-get install libclass-loader-dev
  5.  
    正在读取软件包列表... 完成
  6.  
    正在分析软件包的依赖关系树
  7.  
    正在读取状态信息... 完成
  8.  
    下列软件包是自动安装的并且现在不需要了:
  9.  
    apport-symptoms python3-systemd
  10.  
    使用'sudo apt autoremove'来卸载它(它们)。
  11.  
    将会同时安装下列软件:
  12.  
    xxxxxx

继续执行cmake,又出现了问题,找不到hiredis库

  1.  
    Could not find a package configuration file provided by "hiredis" with any
  2.  
    of the following names:
  3.  
     
  4.  
    hiredisConfig.cmake
  5.  
    hiredis-config.cmake
  6.  
     
  7.  
    Add the installation prefix of "hiredis" to CMAKE_PREFIX_PATH or set
  8.  
    "hiredis_DIR" to a directory containing one of the above files. If
  9.  
    "hiredis" provides a separate development package or SDK, be sure it has
  10.  
    been installed.

使用前面的方法,发现安装hiredis的开发库之后,仍然报错。

  1.  
    ok@u20:~/code/micros_information-dev_v2/build$ sudo apt-get install libhiredis-dev
  2.  
    正在读取软件包列表... 完成
  3.  
    正在分析软件包的依赖关系树
  4.  
    正在读取状态信息... 完成
  5.  
    下列软件包是自动安装的并且现在不需要了:
  6.  
    apport-symptoms python3-systemd
  7.  
    使用'sudo apt autoremove'来卸载它(它们)。
  8.  
    下列【新】软件包将被安装:
  9.  
    libhiredis-dev
  10.  
    xxxxx

然后使用whereis查找hiredis对应的头文件和库。分别在/usr/include/hiredis下面和/usr/lib/x86_64-linux-gnu下面。

  1.  
    ok@u20:/usr/include/hiredis$ ls
  2.  
    adapters  alloc.h  async.h  hiredis.h  read.h  sds.h
  3.  
    ok@u20:/usr/lib/x86_64-linux-gnu$ ls libhi
  4.  
    libhiredis.a libhiredis.so.0.14 libhistory.so.8.0
  5.  
    libhiredis.so libhistory.so.8

于是决定重建hiredis对应的cmake文件,创建/usr/local/lib/cmake/hiredis/hiredisConfig.cmake文件,内容如下:

  1.  
    FIND_PATH(HIREDIS_INCLUDE_DIR hiredis.h
  2.  
    /usr/local/include
  3.  
    /usr/include
  4.  
    )
  5.  
     
  6.  
    FIND_LIBRARY(HIREDIS_LIBRARIES NAMES HIREDIS
  7.  
    PATHS
  8.  
    /usr/local/lib
  9.  
    /usr/lib
  10.  
    /usr/lib/x86_64-linux-gnu
  11.  
    )

然后重新执行cmake,成功。

上述出现这些错误的原因是因为我们在CMakeLists.txt中使用了find_package操作

find_package(hiredis REQUIRED)

 但是实际上libclass_loader.so和libhireids.so在相同目录下:

  1.  
    ok@u20:/usr/lib/x86_64-linux-gnu$ ls libcl
  2.  
    libclass_loader.so libclucene-shared.so.2.3.3.4
  3.  
    libclass_loader.so.0.4.1 libclutter-1.0.so.0
  4.  
    libclass_loader.so.1d libclutter-1.0.so.0.2600.4
  5.  
    libclucene-contribs-lib.so.1 libclutter-glx-1.0.so.0
  6.  
    libclucene-contribs-lib.so.2.3.3.4 libclutter-gst-3.0.so.0
  7.  
    libclucene-core.so.1 libclutter-gst-3.0.so.0.27.0
  8.  
    libclucene-core.so.2.3.3.4 libclutter-gtk-1.0.so.0
  9.  
    libclucene-shared.so.1 libclutter-gtk-1.0.so.0.800.4

但是为什么class_loader安装后就可以使用了,而hiredis不行呢?因为安装class_loader后,已经有了对应的cmake文件。使用模糊查找如下:

  1.  
    ok@u20:/$ sudo find / -iname "*loaderConfig.cmake"
  2.  
    find: ‘/run/user/1000/doc’: 权限不够
  3.  
    find: ‘/run/user/1000/gvfs’: 权限不够
  4.  
    find: ‘/run/user/125/gvfs’: 权限不够
  5.  
    /usr/share/class_loader/cmake/class_loaderConfig.cmake

 而查找hiredis的cmake文件:

  1.  
    ok@u20:/$ sudo find / -iname "*redisConfig.cmake"
  2.  
    find: ‘/run/user/1000/doc’: 权限不够
  3.  
    find: ‘/run/user/1000/gvfs’: 权限不够
  4.  
    find: ‘/run/user/125/gvfs’: 权限不够
  5.  
    /usr/local/lib/cmake/hiredis/hiredisConfig.cmake
  6.  
    /usr/lib/cmake/Poco/PocoRedisConfig.cmake
  7.  
    /usr/lib/x86_64-linux-gnu/cmake/Hiredis/HiredisConfig.cmake

 可以发现,实际上也是有的,只不过所在位置为/urs/local/x86_64-linux-gnu目录下,而这个目录估计不在Cmake的find_package的查找路径下。因此,针对hiredis这个配置,除了前面编写cmake文件外,也可以修改find_package的搜索路径。

Find_Package()的原理

首先,我们简单了解下Find_Package()的原理,它在搜索包时有两种模式:“Module(模块)”模式和“Config(配置)”模式

在Module模式中,CMake会搜索所有名为Find<package>.cmake的文件,此文件的路径由安装CMake时指定的CMAKE_MODULE_PATH变量指定。如果找到了该文件,它会被CMAKE读取并进行处理,会生成以下相关变量:

  1.  
    // 是否发现该库
  2.  
    <LibaryName>_FOUND
  3.  
    // 头文件
  4.  
    <LibaryName>_INCLUDE_DIR or <LibaryName>_INCLUDES
  5.  
    // 库文件
  6.  
    <LibaryName>_LIBRARY or <LibaryName>_LIBRARIES

如果在Module模式中没有找到Find<package>.cmake文件,那么会进入Config模式,Cmake会搜索名为<package>Config.cmake与<package>-config.cmake文件,Cmake路径有很多,有兴趣的可以参考下CMake官方教程,这里提供一个常用路径:/usr/local/lib/cmake/xxx/。该配置文件中指定了依赖库的头文件、库文件地址。通过Config模式找到依赖库后,同样也是会生成库的相应变量,供调用者使用。如果没有找到该配置文件,可以自己创建一个,并不复杂。

对于Module模式,用户也可以自己编写对应的文件,方便自定义模块在Cmake中使用。具体可以参考:Cmake中find_package命令的搜索模式之模块模式(Module mode) - 简书 (jianshu.com)

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiejjah
系列文章
更多 icon
同类精品
更多 icon
继续加载