【问题标题】:Unable to find Eigen3 with CMake无法使用 CMake 找到 Eigen3
【发布时间】:2016-03-12 08:51:31
【问题描述】:

我有点绝望: 对于我的学习,我需要使用 Eigen 和 CMake。如果我将整个库复制到编译器默认显示的目录中,我就可以使用 Eigen,但只要我尝试通过
find_package(Eigen3 REQUIRED)
找到它 我收到以下错误:


CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find Eigen3 (missing: EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
  (Required is at least version "2.91.0")
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  FindEigen3.cmake:76 (find_package_handle_standard_args)
  CMakeLists.txt:8 (find_package)

-- Configuring incomplete, errors occurred!


现在我搜索了解决方案,但我尝试过的所有解决方案(还有那些在 stackoverflow 上可用的解决方案:
Find package Eigen3 for CMake 要么 CMake Can't find Eigen3) 不工作。 我的特征版本(根据Core/util/Macros.h 中的宏)是 3.2.5。 我将 Eigen 目录保存在 /usr/local/include,我使用 Eigen 库附带的 FindEigen3.cmake,我的 CMakeLists.txt 如下所示:


cmake_minimum_required(VERSION 2.8)
project(Test)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
message("Found Eigen3 in: ${EIGEN3_INCLUDE_DIR}")

add_executable(main test.cpp)

有人知道出了什么问题吗?

亲切的问候, 朱利安

【问题讨论】:

  • 欢迎来到 StackOverflow。查找包脚本通常使用find_path() 命令来检测包的包含目录。如果没有自动找到,您可以通过 CMake 应该搜索的路径扩展 CMAKE_INCLUDE_PATH(例如参见 here)。因此,您可以在 find_package() 命令之前添加类似 list(APPEND CMAKE_INCLUDE_PATH "/usr/local/include") 的内容。
  • 谢谢!如果我将确切路径添加到CMAKE_INCLUDE_PATH,它会找到包 - 但不是手动搜索我想要避免的东西吗? find_package() 不应该为我这样做吗?
  • 你是对的。 CMAKE_INCLUDE_PATH 用于非标准的Eigen 安装路径。我已经尝试过您的代码示例,并且 - 如果我将 Eigen 安装到默认路径中 - 它似乎无需提供路径即可工作(请参阅我的答案)。如果您已经使用了Eigen 安装过程,能否请您添加更多关于您的环境的详细信息(CMake 版本、CMake 命令行调用、主机操作系统、编译器版本……)?
  • 好奇,这是关于 caffe 和 AI 的吗?

标签: c++ cmake eigen3


【解决方案1】:

把我的评论变成答案

查找包脚本 - 如FindEigen3.cmake - 通常使用find_path() 命令来检测包的包含目录(有关完整详细信息,请参阅it's documentation)。

FindEigen3.cmake使用如下代码sn-p:

find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
    PATHS
    ${CMAKE_INSTALL_PREFIX}/include
    ${KDE4_INCLUDE_DIR}
    PATH_SUFFIXES eigen3 eigen
)

所以它在 CMAKE_INSTALL_PREFIX 中查找,在 Unix/Linux 主机上默认为 /usr/local

以下内容对我有用:

  • 转到Eigen源目录并运行CMake和安装步骤

    > mkdir build
    > cd build
    > cmake ..
    > make install
    
  • 然后复制 - 正如你所做的那样 - FindEigen3.cmake 到你的项目源目录。

  • 现在您的代码确实找到了Eigen(刚刚更改为list(APPEND ...)

    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
    find_package(Eigen3 REQUIRED)
    

参考文献

【讨论】:

  • 完美它现在正在工作!我认为也引起问题的是,我没有使用$ make install 来安装库,而是将其复制到我的/usr/local/include 中。 FindEigen3.cmake 正在寻找的目录可能太深了(它在 /usr/include/Eigen_all/eigen-tar-folder-name/ 的某个地方)。无论如何 - 非常感谢您的详细回答!
【解决方案2】:

find_package(Eigen3 REQUIRED)之前添加FindEigen3.cmake的路径,像这样:

LIST(APPEND CMAKE_MODULE_PATH "/usr/share/cmake-2.8/Modules/")
find_package(Eigen3)

【讨论】:

  • 不需要将Modules/ 目录,CMake 自带,添加到CMAKE_MODULE_PATH:CMake 无论如何都会在这个目录中搜索。
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2014-08-02
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多