CMake的默认搜索路径包括()与find_package()

时间:2017-02-03 15:28:22

标签: cmake

我在我的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

2 个答案:

答案 0 :(得分:4)

find_package两种模式,它们有很多不同之处:

  1. 模块模式尝试找到FindXXX.cmake文件。在 CMAKE_MODULE_PATH 中列出的目录下搜索文件,并在安装CMake的目录下搜索。

  2. 配置模式尝试找到XXXConfig.cmake文件。在 CMAKE_PREFIX_PATH 和其他一些系统特定变量中列出的目录下搜索该文件。 (完整算法见文档,在帖子开头链接)。

  3. 命令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()文件。