找到包装Eigen3 for CMake

Jav*_*ock 21 cmake eigen

CMake无法找到我的Eigen3包.我设置了一个名为的环境变量

EIGEN3_INCLUDE_DIR
Run Code Online (Sandbox Code Playgroud)

指向路径在哪里FindEigen3.cmake.

然后在CMakelists.txt我写道:

find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )
Run Code Online (Sandbox Code Playgroud)

我得到下一条错误消息:

CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:91 (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):
  C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:252 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindEigen3.cmake:76 (find_package_handle_standard_args)
  test/test_quaternion/CMakeLists.txt:25 (find_package)
Run Code Online (Sandbox Code Playgroud)

关于我遗失或做错的任何想法?

Joh*_* S. 29

由于Eigen3仅是完全标头,因此您只需要包含目录的路径.而这一个,你已经手动定义了.所以没有真正的需要FindEigen3.cmakeFIND_PACKAGE呼叫.

简单地使用

INCLUDE_DIRECTORIES ( "$ENV{EIGEN3_INCLUDE_DIR}" )
Run Code Online (Sandbox Code Playgroud)

要么

SET( EIGEN3_INCLUDE_DIR "$ENV{EIGEN3_INCLUDE_DIR}" )
IF( NOT EIGEN3_INCLUDE_DIR )
    MESSAGE( FATAL_ERROR "Please point the environment variable EIGEN3_INCLUDE_DIR to the include directory of your Eigen3 installation.")
ENDIF()
INCLUDE_DIRECTORIES ( "${EIGEN3_INCLUDE_DIR}" )
Run Code Online (Sandbox Code Playgroud)

几点说明:

  1. 如果要访问CMake变量的内容,请务必使用${...}
  2. $ENV{....} 访问环境变量.
  3. 如果未设置环境变量,则第二个示例将停止并显示错误(因此,EIGEN3_INCLUDE_DIR cmake变量为空)
  4. 如果它们可以包含空格,请注意在(已评估)变量周围使用引号.否则,CMake会将其解释为列表.
  5. 如果要使用自定义查找模块,请确保将它们放在CMake安装中,或者如上面指出的@Fraser一样,确保指向CMAKE_MODULE_PATH它所在的目录.不确定,但可能是CMake自动检查当前目录(你CMakeLists.txt居住的地方.无论如何,设置EIGEN3_INCLUDE_DIR完全与位置无关)FindEigen3.cmake
  6. 但是,您的FindEigen3脚本可能会评估此变量以确定Eigen3安装的位置.
  7. 或者,自建的基于CMake的项目通常提供<PackageName>Config.cmake.如果将调用的变量指向<PackageName>_DIR包含此文件的目录,则可以FIND_PACKAGE( <PackageName> ...)正常使用.有关详细信息,请参阅FIND_PACKAGE文档.

  • 什么是 Eigen3 包含目录? (7认同)
  • 是的,这是我正在寻找的答案.关键是**$ ENV**,谢谢你.我在这篇文章中学到了很多东西. (3认同)
  • **MESSAGE( FATAL_ERROR "请将环境变量 EIGEN3_INCLUDE_DIR 指向 Eigen3 安装的包含目录。"** 之后缺少右括号 (2认同)
  • 如何设置EIGEN3_INCLUDE_DIR? (2认同)

Emi*_*mil 10

首先,确保正确安装Eigen.请参阅INSTALLtarball附带的文件.

其次,将cmake/FindEigen3.cmake文件从tarball 复制到包含你的目录CMakeLists.txt.

在你的CMakeLists.txt添加中:

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

现在你应该可以做到,例如#include <Eigen/Core>.

所有这些(主要)来自这个来源.

这种方法的优势include_directories("$ENV{EIGEN3_INCLUDE_DIR}")在于,它使用CMake的标准机制来查找外部依赖关系,使其他人(或您未来的自己)更容易接收项目,可能在另一个平台上.

(但是,如果Eigen本身安装了一个EigenConfig.cmake文件,可以通过该find_package机制访问它而不需要任何额外的路径.)

  • 不,Eigen应该安装cmake配置包文件.http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#creating-packages (3认同)

Lev*_*son 6

Eigen> = 3.3具有直接的CMake集成,因此看来您的设置不正确。

假设已将Eigen安装为/opt/eigen/3.3具有默认设置。将位置附加或附加/opt/eigen/3.3到环境变量,CMAKE_PREFIX_PATH例如bash中:

export CMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH:/opt/eigen/3.3"
Run Code Online (Sandbox Code Playgroud)

然后CMake应该拿起它。


如果您正在编写使用Eigen的自己的CMakeLists.txt,我建议使用如下代码:

find_package (Eigen3 3.3 REQUIRED)
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)
Run Code Online (Sandbox Code Playgroud)

自CMake 3发布以来,您就不应该使用它include_directories-目标方法应尽可能地首选。