【问题标题】:Where does cmake look to find packages?cmake 在哪里寻找包?
【发布时间】:2015-01-16 05:13:36
【问题描述】:

Ubuntu 14.04 中,我正在编译一个C++ 程序,它依赖于以下包:CUDAOpenNI。在该程序的CMakeListst.txt 文件中,有以下内容:

find_package(CUDA)
find_package(OpenNI)

cmake 的输出是:

Found CUDA: /usr/local/cuda (found version "6.5") 
-- Could NOT find OpenNI (missing:  OpenNI_LIBRARY OpenNI_INCLUDE_DIR)

所以,似乎找到了CUDA,但没有找到OpenNI。现在,我肯定安装了OpenNI,但可能不在标准位置。如上所述,CUDA 文件位于 usr/local/cuda 中,而我的 OpenNI 文件位于 ~/Libraries/OpenNI 中。

我的问题是:我如何告诉cmake 在哪里寻找定义OpenNI_LIBRARYOpenNI_INCLUDE_DIR 变量? cmake 是否有一个文件为所有这些变量定义了路径,我可能需要手动编辑?

【问题讨论】:

  • 当您运行 CMake UI(如 cmake-guiccmake)时,它会显示您可以设置的变量列表。
  • 谢谢,我看过了,这有点帮助。但是,我对这些变量在计算机上实际定义的位置感兴趣,即cmake-gui 自行编辑的文件在哪里。
  • /path/to/you/build/directory/CMakeCache.txt

标签: c++ ubuntu cmake


【解决方案1】:

它在 CMAKE_MODULE_PATH 中查找。

使用这样的表达式附加到此路径

列表(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

【讨论】:

  • 嗯,这是它寻找FindOpeNI.cmake 模块的地方,而不是OpenMI 库(也不是OpenMIConfig.cmake 包配置文件,就此而言)。
  • 没错。在 CMAKE_MODULE_PATH 中搜索 FindXXX.cmake。否则,您可以更改 PREFIX
【解决方案2】:

没有统一的方式告诉您查找脚本将尝试在哪里查找库。

这有点不幸,但唯一确定的方法是检查 find 脚本本身的来源。大多数查找脚本依赖find_library 和类似的命令来定位它们的文件,默认情况下,它们会在许多明显的候选位置进行搜索(如Unix 上的/usr/local/)。

不幸的是,仅此一项并不能让您走得很远。如果你被困在像 Windows 这样没有合理默认位置的平台上,或者你想避免污染目录树,你需要另一种方法。因此,大多数查找脚本都允许以某种方式注入库的位置。

根据我的经验,最简洁的方法是通过环境变量。它们配置灵活,使用方便。特别是,您可以通过将它们添加到用户的环境来使它们持久化,这样您就不必在每次运行 CMake 时都输入它们。

如果您检查例如the find script for CUDA that ships with CMake,您会注意到它为此目的使用了环境变量CUDA_PATHCUDA_LIB_PATHCUDA_INC_PATHCUDA_BIN_PATH(以及其他一些)。

另一种方法是通过CMake's -D parameter从命令行直接在缓存中设置查找脚本的结果变量。

在任何情况下,您都必须检查查找脚本源以找出最佳操作方案。

忠告:不要尝试在您自己的 CMakeLists 中硬编码位置。虽然这似乎是一个快速的解决方案,但它也是一个非常肮脏的解决方案,它本质上使您的构建系统不可重定位。始终寻求允许用户从外部配置构建系统而无需更改 CMake 代码的解决方案。

【讨论】:

    【解决方案3】:

    即使这是一个很老的问题:如果你用--debug-find 调用cmake,它会告诉你它在哪里寻找你通过CMake 脚本中的find_package() 调用请求的包。

    我个人的偏好是定义一个环境变量<package_name>_DIR,特别是对于驻留在它们自己专用位置的包,它指向包的配置文件(假设lib 提供了一个)。有关详细信息,请参阅有关搜索过程的 find_package() 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2019-05-02
      • 2012-05-21
      • 2011-08-01
      相关资源
      最近更新 更多