我在我的Debian机器上安装了VTK6,它将所有CMake文件放在
下$ ls /usr/lib/cmake/vtk-6.3/
[...]
VTKConfig.cmake
vtkModuleAPI.cmake
[...]
当我这样做时
find_package(VTK)
在另一个项目中,一切都很好。然而,
include(vtkModuleAPI)
产生错误
include could not find load file:
vtkModuleAPI
我一直认为find_package()
和include
共享相同的搜索路径,特别是CMAKE_MODULE_PATH
。显然这不正确。
请注意
SET(CMAKE_MODULE_PATH "/usr/lib/cmake/vtk-6.3")
include(vtkModuleAPI)
确实有效。
另请注意,我使用的是CMake 3.5,因此不再有FindVTK.cmake
as it used to be。
find_package()
和include()
的默认搜索路径是什么?为什么找不到vtkModuleAPI.cmake
?
答案 0 :(得分:4)
find_package有两种模式,它们有很多不同之处:
模块模式尝试找到FindXXX.cmake
文件。在 CMAKE_MODULE_PATH 中列出的目录下搜索文件,并在安装CMake的目录下搜索。
配置模式尝试找到XXXConfig.cmake
文件。在 CMAKE_PREFIX_PATH 和其他一些系统特定变量中列出的目录下搜索该文件。 (完整算法见文档,在帖子开头链接)。
命令include仅在 CMAKE_MODULE_PATH 和特殊CMake模块目录中的目录下搜索模块。
如您所见,模块模式中的命令include
和命令find_package
使用类似的搜索路径。但在您的情况下,VTKConfig.cmake
只能在find_package
的配置模式中进行搜索,该模式使用完全不同的搜索算法。
如果是VTK,CMake已发送FindVTK.cmake
文件,当您拨打find_package(VTK)
时会使用该文件。但在内部,此脚本使用find_package(VTK QUIET NO_MODULE)
。
如果此调用找到文件/usr/lib/cmake/vtk-6.3/VTKConfig.cmake
,则执行此脚本,脚本包含vtkModuleAPI.cmake
个。
如果CMake找不到您的VTKConfig.cmake
,您可以通过将 VTK_DIR 变量设置为/usr/lib/cmake/vtk-6.3/
来帮助它。
[从CMake-3.1开始,CMake不再附带FindVTK.cmake
,因此find_package(VTK)
会立即尝试找到VTKConfig.cmake
]。
在任何情况下,目录/usr/lib/cmake/vtk-6.3/
中的模块都不应直接包含:此目录为VTK的私有。
答案 1 :(得分:1)
find_package(VTK)
使用FindVTK.cmake
(在其模块模式,c.f. docu on find_package()
),由CMake提供,(在您的情况下)应位于{ {1}}。
将/usr/share/cmake/Modules
添加到/usr/lib/cmake/vtk-6.3
后,CMAKE_MODULE_PATH
仍将使用相同的find_package(VTK)
模块。
如果您想使用其他FindVTK.cmake
模块,请将FindVTK.cmake
模块的路径添加到FindVTK.cmake
。
CMAKE_MODULE_PATH
不会使用查找模块,只有会看到位于include()
的文件。