cmake在哪里寻找包裹?

时间:2014-11-18 21:08:35

标签: c++ ubuntu cmake

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为所有这些变量定义路径的文件,我可能需要手动编辑?

3 个答案:

答案 0 :(得分:2)

它在CMAKE_MODULE_PATH中查找。

使用类似

的表达式追加到此路径

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

答案 1 :(得分:2)

没有统一的方法可以告诉您查找脚本将在何处尝试查找库。

这有点不幸,但唯一可以确定的方法是检查查找脚本本身的来源。大多数查找脚本都依赖于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从命令行直接在缓存中设置find脚本的结果变量。

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

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

答案 2 :(得分:0)

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

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