CMake find_package在不同环境中使用不同的搜索路径

时间:2018-11-15 12:13:54

标签: c++ cmake

我将CMake 3.10.2用于C ++项目,并且在需要第三方库程序包并在不同环境中运行CMake时遇到CMake的奇怪行为:我需要一个库(在这里称为SOME_LIB)通过

find_package(SOME_LIB REQUIRED)
尽管在两个环境中CMake调用都相同,但

搜索路径不同(CMake查找软件包的路径)。两次调用CMake时都有一些参数,一个是

-DSOME_LIB_DIR=/path/to/lib

提供软件包的安装路径。

在第一种环境中,它可以正常工作,但是在第二种系统中,找不到该库:

CMake Warning at CMakeLists.txt:123 (find_package):
  By not providing "FindSOME_LIB.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "SOME_LIB", but
  CMake did not find one.

  Could not find a package configuration file provided by "SOME_LIB" with any of
  the following names:

    SOME_LIBConfig.cmake
    SOME_LIB-config.cmake

  Add the installation prefix of "SOME_LIB" to CMAKE_PREFIX_PATH or set
  "SOME_LIB_DIR" to a directory containing one of the above files.  If "SOME_LIB"
  provides a separate development package or SDK, be sure it has been
  installed.

添加选项

 -DCMAKE_FIND_DEBUG_MODE=ON
CMake调用的

表明,两种环境的搜索路径不同。特别是,在第二个系统上,仅仅应用以下documented个搜索模式中的第一个

<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)

由于搜索模式<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/会在我的情况下找到该软件包,因此我最初认为第二个系统未被识别为类Unix系统,但是文档还指出,“只是一个约定,因此仍在所有平台上搜索所有(W)和(U)目录。”所以我应该在CMake的调试输出中看到所有路径,不是吗?

环境是:

  1. 第一个环境(运行良好)是一个基于 Ubuntu 18.04的Docker容器,用于与GitLab CI进行持续集成;该图像配备了一些基本的开发工具和我正在使用的第三方库

  2. 第二个环境(找不到软件包;缺少搜索路径)是用于本地开发的 Ubuntu 18.04 Windows子系统(用于Linux)环境(按照docker镜像的步骤进行新设置)

两个环境都安装了相同的软件包,包括来自Ubuntu存储库(CMake 3.10.2)的cmake。我想与find_package一起使用的库是使用CMake构建的,并且在两种环境中都以相同的方式安装。两种环境中库的目录内容是相同的。

我还尝试将第二个环境中的CMake升级到3.10.3和3.12.4(都是从源代码构建的),但是问题仍然存在。

1 个答案:

答案 0 :(得分:0)

Tsyvarev的评论使我得到了我的问题的答案:

问题是由于我对

的误解引起的
-D<PACKAGE>_DIR=/path/to/config

参数。正如Tsyvarev指出的那样,文档说 <PACKAGE>_DIR必须指向包含配置文件的目录的确切路径 <PACKAGE>-config.cmake。换句话说,它不是前缀路径。

它仍然在以下两种环境之一中起作用的原因仍然是一个问题:原因是我在之前从未注意到的两种环境中,库的安装路径之间存在很小但很重要的变化:

  1. 第一个环境(docker容器):/opt/<library_name>-<version-number>/(请注意-这很重要!)
  2. 第二环境(用于Linux Ubuntu的Windows子系统):/opt/<library_name>/<version-number>/

注意:CMake配置在

中,两个路径都包含相同的内容
  1. /opt/<library_name>-<version-number>/lib/cmake/<library_name>/<library_name>-config.cmake分别用于第一个环境和
  2. /opt/<library_name>/<version-number>/lib/cmake/<library_name>/<library_name>-config.cmake用于第二个环境。

在第一个环境中,因为匹配模式<prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/而找到了库,其中/opt是CMake的<prefix>路径之一,而<name>*被扩展为{{1 }}-在第二个环境中无法进行路径扩展。

非常感谢您的有用评论。对于缺少路径变化,我深表歉意(已经看了两天了,但没有看到问题)。