【发布时间】:2019-06-13 13:14:02
【问题描述】:
我在 Windows 上使用 cmake 构建依赖于 ITK 的 RTK,但 RTK(它使用 find_package())无法找到我的 ITK 安装,尽管我使用 ITK_DIR 提供了它的安装位置。
我已经单独构建了 ITK 并在<...>/ITK/install 中安装了它(使用 cmake 安装目标)。我可以看到ITKConfig.cmake 已放入<...>/ITK/install/lib/cmake/ITK-4.13。我用
> 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