对未安装包CMake的“find_package”命令意外成功

问题描述 投票:2回答:1

我下面的“chapter-02/recipe-06CMake Cookbook。这个特殊的例子需要Eigen C++ libraries

我试图建立的例子,并得到了本征未发现的错误。

CMake Error at CMakeLists.txt:9 (find_package):
  Could not find a package configuration file provided by "Eigen3" (requested
  version 3.3) with any of the following names:

    Eigen3Config.cmake
    eigen3-config.cmake

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

这是预料之中,因为图书馆是不是我的系统上安装。

然后我下载了本征库“.ZIP”文件,并将其解压到任意位置,我的项目之外。我在艾根目录下创建“构建”文件夹,在“创建”的文件夹跑cmake ..。 (我只跑了cmake的 - 我没有建立或安装包)。


在本征build目录运行CMake的后,我又回到了示例代码为“配方-06”,这是奇迹般地能找到本征库,并成功打造,即使征未建或安装。

不知怎的,就在本征项目的CMake运行CMake的制作意识到征库的位置。这样做了以后,那做find_package任何项目找到Eigen3某种方式得到定义的变量${Eigen3_DIR}并能够找到它。


纵观CMake的文档find_package我不明白为什么这个工程的任何解释。征是不是在任何find_package搜索的典型位置。据the documentation它看起来像它应该不会被发现。

更有趣的 - 它并不重要,我把我的本征的系统上。我可以把它放在任何地方从字面上,它仍然会发现它。

据我看到的一切它不应该被发现的文件中...但它被发现。所以,问题是怎么样?为什么这项工作?

附加信息:我使用的CMake版本3.13.3

c++ cmake
1个回答
3
投票

有2 XXXConfig.cmake文件“起源”,由find_package()调用内部使用。

通常情况下,在安装项目时产生XXXConfig.cmake文件,该文件包含有关已安装的库和头文件信息。

但CMake的还提供了一个export()命令,它允许导出构建树。

export(PACKAGE <name>)

存放在包<name> CMake的用户包注册表当前版本目录。同时寻找包find_package<name>命令可以考虑的目录。

本征的CMakeLists.txt使用export()命令,因此该项目只为征运行find_package后变得与cmake检测。

© www.soinside.com 2019 - 2024. All rights reserved.