cmake在哪里查找软件包?

12
在Ubuntu 14.04中,我正在编译一个依赖于以下软件包的C++程序:CUDA和OpenNI。在该程序的CMakeLists.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_LIBRARY 和 OpenNI_INCLUDE_DIR 变量?是否有一个文件,其中 cmake 定义了所有这些变量的路径,我需要手动编辑它?


当你运行 CMake 的 UI(例如 cmake-guiccmake)时,它会呈现一个变量列表,供你进行设置。 - Angew is no longer proud of SO
1
谢谢,我看了一下,有点帮助。但是,我更想知道这些变量在计算机上实际定义的位置,即cmake-gui编辑自身的文件所在位置。 - Karnivaurus
/path/to/you/build/directory/CMakeCache.txt - Angew is no longer proud of SO
3个回答

4

它在CMAKE_MODULE_PATH中查找。

使用以下表达式将其附加到此路径:

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)


1
那就是它寻找 FindOpeNI.cmake 模块的地方,而不是 OpenMI 库(也不是 OpenMIConfig.cmake 包配置文件)。 - Angew is no longer proud of SO
没错。在CMAKE_MODULE_PATH中搜索FindXXX.cmake文件。否则,您可以更改PREFIX。 - Jens Munk

3

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

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

不幸的是,这还不够。如果您卡在像Windows这样的平台上,其中没有合理的默认位置,或者您想避免污染目录树,则需要另一种方式。因此,大多数查找脚本允许以某种方式注入库的位置。

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

如果您查找例如 CMake随CUDA一起提供的查找脚本,您会注意到它使用环境变量 CUDA_PATHCUDA_LIB_PATHCUDA_INC_PATHCUDA_BIN_PATH(以及其他几个)来实现此目的。
另一种选择是通过 CMake的-D参数 直接从命令行设置缓存中查找脚本的结果变量。
无论如何,您都需要检查查找脚本源代码以找出最佳操作方式。
一个建议:不要试图在自己的 CMakeLists 中硬编码位置。虽然这可能看似是快速解决方案,但它也是一个非常肮脏的解决方案,实质上使您的构建系统无法重定位。始终寻求允许用户从外部配置构建系统而无需更改CMake代码的解决方案。

3
即使这是一个相当老的问题:如果您使用--debug-find调用cmake,它将告诉您在CMake脚本中通过find_package()调用请求的软件包所在的位置。
我的个人偏好,特别是对于驻留在其专用位置的软件包,是定义一个环境变量<package_name>_DIR,该变量指向软件包的配置文件(假设该库提供了一个配置文件)。有关搜索过程的详细信息,请参见 find_package() 文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接