代码之家  ›  专栏  ›  技术社区  ›  tjwrona1992

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

  •  2
  • tjwrona1992  · 技术社区  · 5 年前

    我在跟踪 chapter-02/recipe-06 在“ CMake Cookbook “。此特定示例要求 Eigen C++ libraries .

    我试图构建示例,但得到的错误是找不到Eigen。

    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.
    

    这是预期的,因为库未安装在我的系统上。

    然后,我下载了Eigen库的“.zip”文件,并将其解压缩到项目之外的任意位置。我在Eigen目录中创建了一个“build”文件夹并运行 cmake .. 在“build”文件夹中。 (我只运行了cmake-我没有构建或安装该软件包。)


    在Eigen build目录上运行CMake之后,我返回到“recipe-06”的示例代码,它神奇地找到了Eigen库并成功构建,即使Eigen从未构建或安装。

    不知何故,仅仅在Eigen项目中运行CMake就让CMake知道了Eigen库的位置。完成此操作后,任何 find_package 以某种方式找到Eigen3 ${Eigen3_DIR} 变量已定义,并且能够找到它。


    查看CMake文档中的 查找包 我看不出有任何解释说明为什么这会起作用。Eigen不在以下任何典型位置: 查找包 the documentation

    更有趣的是,我把Eigen放在我的系统的什么地方并不重要。我可以把它放在任何地方,它仍然会找到它。

    其他信息:我正在使用CMake版本3.13.3

    1 回复  |  直到 5 年前
        1
  •  3
  •   Tsyvarev    5 年前

    有两个“起源”的 XXXConfig.cmake 文件,由内部使用 find_package() 呼叫

    通常 文件是在项目启动时生成的 安装 ,该文件包含有关已安装库和头的信息。

    但CMake也提供了一个 export() 命令,该命令允许导出 建树

    export(PACKAGE <name>)

    将当前生成目录存储在包的CMake用户包注册表中 <name> . 这个 find_package 命令可以在搜索包时考虑目录。 <名称>

    艾根氏 CMakeLists.txt 使用 export() 命令,使项目可以通过 刚跑完 cmake 对于艾根。