CMake无法找到Eigen3

13

I am kind of desperate: For my studies I need to work with Eigen and CMake. I'm able to use Eigen if I copy the whole library in the directories where my compiler looks by default but as soon as I try to find it via
find_package(Eigen3 REQUIRED)
I get the following error:


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)

-- 配置不完整,出现错误!

现在我正在寻找解决方案,但我尝试过的所有方法(包括stackoverflow上可用的方法:
为CMake查找Eigen3软件包 或者 CMake无法找到Eigen3) 都没有起作用。 根据Core/util/Macros.h中的宏,我的Eigen版本是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)

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

亲切的问候, 朱利安


1
欢迎来到StackOverflow。查找包脚本通常使用find_path()命令来检测包含目录。如果没有自动发现,您可以通过将路径添加到CMAKE_INCLUDE_PATH来扩展搜索路径(例如请参考这里)。因此,在find_package()命令之前添加类似于list(APPEND CMAKE_INCLUDE_PATH "/usr/local/include")的内容即可。 - Florian
谢谢!如果我将确切的路径添加到 CMAKE_INCLUDE_PATH 中,它就可以找到该软件包 - 但是手动搜索不正是我想要避免的吗?难道 find_package() 不应该替我完成这项任务吗? - Cryoris
你是对的。CMAKE_INCLUDE_PATH 是为非标准的 Eigen 安装路径而设计的。我已经尝试了你的代码示例,如果我将 Eigen 安装到默认路径下,似乎不需要提供路径就可以正常工作(请参见我的答案)。如果您已经使用了 Eigen 的安装过程,请在您的环境中添加更多详细信息(例如 CMake 版本、CMake 命令行调用、主机操作系统、编译器版本等)。 - Florian
这是关于Caffe和人工智能的吗? - A P
2个回答

15

将我的评论转化为答案

查找包脚本 - 如FindEigen3.cmake - 通常使用find_path()命令来检测包含目录(有关完整详情,请参见其文档)。

FindEigen3.cmake使用以下代码片段:

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

从默认情况下,在Unix / Linux主机上,它在CMAKE_INSTALL_PREFIX中查找,其默认值为/usr/local

以下方法适用于我:

  • 进入源目录并运行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/ 的某个地方)。无论如何 - 非常感谢您详细的答案! - Cryoris

1
find_package(Eigen3 REQUIRED) 前添加 FindEigen3.cmake 的路径,如下所示:
LIST(APPEND CMAKE_MODULE_PATH "/usr/share/cmake-2.8/Modules/")
find_package(Eigen3)

2
不需要将随CMake一起提供的“Modules/”目录添加到“CMAKE_MODULE_PATH”中:CMake无论如何都会在此目录中搜索。 - Tsyvarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接