为什么find_package()不在$ {<名称> _DIR} / lib / cmake / <名称>-<版本>中查找?

时间:2019-06-13 13:14:02

标签: cmake

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

我已经分别构建了ITK并将其(使用cmake安装目标)安装在<...>/ITK/install中。我可以看到ITKConfig.cmake中已放入<...>/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中,但不在lib/cmake/ITK-4.13文件所在的子目录ITKConfig.cmake中。

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

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

然后find_package()查找ITK并起作用。

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

1 个答案:

答案 0 :(得分:1)

对于Foo_DIR软件包的搜索配置文件,

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

  

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

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

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

         

    <PackageName>_DIR

         

    CMAKE_PREFIX_PATH

         

    CMAKE_FRAMEWORK_PATH

         

    CMAKE_APPBUNDLE_PATH

  2.   

在这里您可能会发现<PackageName>_DIR变量,但是那时它是环境变量:

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

如果要设置CMake变量,则可以设置<PackageName>_ROOT变量:

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

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