我在我的 Debian 机器上安装了 VTK6,它将所有的 CMake 文件放在
$ ls /usr/lib/cmake/vtk-6.3/
[...]
VTKConfig.cmake
vtkModuleAPI.cmake
[...]
Run Code Online (Sandbox Code Playgroud)
当我做
find_package(VTK)
Run Code Online (Sandbox Code Playgroud)
在另一个项目中,一切正常。然而,
include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)
产生错误
include could not find load file:
vtkModuleAPI
Run Code Online (Sandbox Code Playgroud)
我一直认为find_package()和include共享相同的搜索路径,特别是CMAKE_MODULE_PATH. 显然这是不正确的。
注意
SET(CMAKE_MODULE_PATH "/usr/lib/cmake/vtk-6.3")
include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)
确实有效。
另请注意,我使用的是 CMake 3.5,因此不再FindVTK.cmake 像以前那样使用.
什么是默认的搜索路径find_package()和include()?为什么vtkModuleAPI.cmake找不到?
有两种模式的find_package,其中有许多不同之处:
模块模式尝试定位FindXXX.cmake文件。在CMAKE_MODULE_PATH 中列出的目录下以及安装 CMake 的目录下搜索该文件。
配置模式尝试定位XXXConfig.cmake文件。在CMAKE_PREFIX_PATH和一些其他特定于系统的变量中列出的目录下搜索该文件。(完整算法见文档,链接在文章开头)。
命令包括仅在CMAKE_MODULE_PATH和特殊 CMake 模块目录中的目录下搜索模块。
正如你所看到的,命令include和命令find_package的模块方式使用类似的搜索路径。但在您的情况下,VTKConfig.cmake只能在 的配置模式下搜索find_package,它使用完全不同的搜索算法。
在 VTK 的情况下,CMake 已经提供了FindVTK.cmake文件,当您调用find_package(VTK). 但在内部,这个脚本使用find_package(VTK QUIET NO_MODULE).
如果此调用定位 file /usr/lib/cmake/vtk-6.3/VTKConfig.cmake,则执行此脚本,并且该脚本包含vtkModuleAPI.cmake一个。
如果VTKConfig.cmakeCMake 未找到您的位置,则可以通过将VTK_DIR变量设置为/usr/lib/cmake/vtk-6.3/.
[从 CMake-3.1 开始,FindVTK.cmake不再随 CMake 一起提供,因此find_package(VTK)立即尝试定位VTKConfig.cmake]。
在任何情况下,目录中的模块/usr/lib/cmake/vtk-6.3/ 都不应该直接包含:这个目录是VTK私有的。
| 归档时间: |
|
| 查看次数: |
4704 次 |
| 最近记录: |