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

2024-02-16

我在 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() and include共享相同的搜索路径,特别是CMAKE_MODULE_PATH。显然这是不正确的。

注意

SET(CMAKE_MODULE_PATH "/usr/lib/cmake/vtk-6.3")
include(vtkModuleAPI)

确实有效。

另请注意,我使用的是 CMake 3.5,因此不再有FindVTK.cmake 往常 https://cmake.org/cmake/help/v3.5/module/FindVTK.html.

默认搜索路径是什么find_package() and include()?为什么是vtkModuleAPI.cmake未找到?


两种模式 of 查找包 https://cmake.org/cmake/help/v3.7/command/find_package.html,它们有很多区别:

  1. 模块模式试图找到FindXXX.cmake文件。该文件在列出的目录下搜索CMAKE_MODULE_PATH在 CMake 安装目录下加上。

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

Command include https://cmake.org/cmake/help/v3.7/command/include.html仅在以下目录下搜索模块CMAKE_MODULE_PATH和特殊的 CMake 模块目录。

如你所见,命令include和命令find_package in 模块模式使用类似的搜索路径。但就你而言,VTKConfig.cmake只能在以下位置搜索配置模式 of 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 one.

If your 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/ 不应该直接包含在内: 这个目录是private对于VTK。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake include() 与 find_package() 的默认搜索路径 的相关文章

随机推荐