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

Nic*_*mer 3 cmake

我在我的 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找不到?

Tsy*_*rev 6

两种模式find_package,其中有许多不同之处:

  1. 模块模式尝试定位FindXXX.cmake文件。在CMAKE_MODULE_PATH 中列出的目录下以及安装 CMake 的目录下搜索该文件。

  2. 配置模式尝试定位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私有的。

  • 我认为帖子的第二部分可以浓缩为最后一句话。有备份也很棒。包含问题来自 ParaView,顺便说一句(https://github.com/Kitware/ParaView/blob/master/CMakeLists.txt#L576)。-- 创建 VTK _and_ CMake 的公司。(当然,这并不意味着他们总是正确使用它。) (2认同)