在Ubuntu 14.04
中,我正在编译C++
程序,该程序取决于以下软件包:CUDA
和OpenNI
。在此程序的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_LIBRARY
和OpenNI_INCLUDE_DIR
变量?是否存在cmake
为所有这些变量定义路径的文件,我可能需要手动编辑?
答案 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_PATH
,CUDA_LIB_PATH
,CUDA_INC_PATH
和CUDA_BIN_PATH
(以及为此目的,很少有人。
另一种方法是通过CMake's -D
parameter从命令行直接在缓存中设置find脚本的结果变量。
在任何情况下,您都必须检查查找脚本来源,以找出最佳操作方法。
建议:不要尝试在您自己的CMakeLists中对位置进行硬编码。虽然这看起来像是一个快速的解决方案,但它也是一个非常脏的,它本质上使您的构建系统不可重定位。始终寻求允许用户从外部配置构建系统而无需更改CMake代码的解决方案。
答案 2 :(得分:0)
即使这是一个相当古老的问题:如果您使用 cmake
调用 --debug-find
,它会告诉您它在哪里查找您通过 CMake 中的 find_package()
调用请求的包脚本。
我个人的偏好,特别是对于驻留在它们自己专用位置的包,是定义一个环境变量 <package_name>_DIR
,它指向包的配置文件(假设 lib 提供了一个)。有关详细信息,请参阅有关搜索过程的 find_package() 文档。