我在Windows上使用cmake来构建依赖于ITK的RTK,但是RTK(使用find_package())无法找到我的ITK安装,尽管我提供了ITK_DIR
的安装位置。
我已经分别构建了ITK并将其(使用cmake安装目标)安装在<...>/ITK/install
中。我可以看到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
中,但不在lib/cmake/ITK-4.13
文件所在的子目录ITKConfig.cmake
中。
但是,如果我要指出该文件所在的特定文件夹,如下所示:
> cmake -DITK_DIR=<...>/ITK/install/lib/cmake/ITK-4.13 .
然后find_package()查找ITK并起作用。
我误解了什么?我希望不必在ITK_DIR
变量中提供软件包的版本名称,因此文档中描述的行为将很不错。
答案 0 :(得分:1)
Foo_DIR
软件包的搜索配置文件, CMake 变量Foo
不是前缀。这是完全位于或根本不位于配置文件的目录:
如果将
<PackageName>_DIR
设置为不包含配置文件的目录,CMake将忽略它并从头开始搜索。
find_package
的描述包含用于选择前缀的算法。其中之一是:
搜索特定于cmake的环境变量中指定的路径。 ...
<PackageName>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
在这里您可能会发现<PackageName>_DIR
变量,但是那时它是环境变量:
> ITK_DIR=<...>/ITK/install cmake .
如果要设置CMake变量,则可以设置<PackageName>_ROOT
变量:
> cmake -DITK_ROOT=<...>/ITK/install .
请注意,此类变量仅在最新的CMake版本(自CMake 3.12起)中使用。