【问题标题】:Why doesn't find_package() look in ${<name>_DIR}/lib/cmake/<name>-<version>?为什么 find_package() 不在 ${<name>_DIR}/lib/cmake/<name>-<version> 中查找?
【发布时间】:2019-06-13 13:14:02
【问题描述】:

我在 Windows 上使用 cmake 构建依赖于 ITK 的 RTK,但 RTK(它使用 find_package())无法找到我的 ITK 安装,尽管我使用 ITK_DIR 提供了它的安装位置。

我已经单独构建了 ITK 并在&lt;...&gt;/ITK/install 中安装了它(使用 cmake 安装目标)。我可以看到ITKConfig.cmake 已放入&lt;...&gt;/ITK/install/lib/cmake/ITK-4.13。我用

调用 cmake
> cmake -DITK_DIR=<...>/ITK/install .

根据documentation of find_package()

[...] CMake 为包构建了一组可能的安装前缀。在每个前缀下搜索几个目录以查找配置文件。下表显示了搜索的目录。每个条目都适用于遵循 Windows (W)、UNIX (U) 或 Apple (A) 约定的安装树:

<prefix>/                                                       (W)
<prefix>/(cmake|CMake)/                                         (W)
<prefix>/<name>*/                                               (W)
<prefix>/<name>*/(cmake|CMake)/                                 (W)
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/                  (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/                        (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/          (U)
<prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/          (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/                (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (W/U)

[...] 上面标有 (W) 的目录适用于 Windows 上的安装,其中前缀可能指向应用程序安装目录的顶部。标有 (U) 的那些用于安装在多个包共享前缀的 UNIX 平台上。 这只是一个约定,因此仍然会在所有平台上搜索所有 (W) 和 (U) 目录。

根据这些信息,我预计 find_package() 会找到 ITKConfig.cmake。但它回退到我在C:\Program Files 中的 ITK 系统安装。我启用了CMAKE_FIND_DEBUG_MODE=ON 并从 find_package() 得到以下输出:

  Checking file [C:/<...>/ITK/install/ITKConfig.cmake]
  Checking file [C:/<...>/ITK/install/itk-config.cmake]
  Checking prefix [C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/]
  Checking file [C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/ITKConfig.cmake]
  Checking file [C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/itk-config.cmake]
... <more> ...

它似乎在ITK_DIR 中查找,但不在ITKConfig.cmake 文件所在的子目录lib/cmake/ITK-4.13 中。

但是,如果我指出该文件所在的特定文件夹,如下所示:

> cmake -DITK_DIR=<...>/ITK/install/lib/cmake/ITK-4.13 .

然后 find_package() 找到 ITK 并且它可以工作。

我误解了什么?我希望不必在 ITK_DIR 变量中提供包的版本名称,因此文档中描述的行为会很好。

【问题讨论】:

  • 请注意,搜索目录不会包含 versioned 组件 ITK-4.13/。不知道为什么 ITK 项目将配置文件安装到该子目录中...

标签: cmake


【解决方案1】:

CMake 变量 Foo_DIR 不是 Foo 包的搜索配置文件的前缀。这是配置文件完全位于或根本不位于的目录:

如果&lt;PackageName&gt;_DIR 已设置为不包含配置文件的目录,CMake 将忽略它并从头开始搜索。

find_package 的描述包含选择前缀的算法。其中之一是:

  1. 在特定于 cmake 的环境变量中指定的搜索路径。 ...

    &lt;PackageName&gt;_DIR

    CMAKE_PREFIX_PATH

    CMAKE_FRAMEWORK_PATH

    CMAKE_APPBUNDLE_PATH

在这里你可能会找到&lt;PackageName&gt;_DIR 变量,但那个时候是环境变量:

> ITK_DIR=<...>/ITK/install cmake .

如果你想设置CMake变量,那么你可以设置&lt;PackageName&gt;_ROOT变量:

> cmake -DITK_ROOT=<...>/ITK/install .

请注意,此类变量仅由最近的 CMake 版本(自 CMake 3.12 起)使用。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多