找到包装Eigen3 for CMake

时间:2012-09-03 13:48:03

标签: cmake eigen

CMake无法找到我的 Eigen3 套餐。我设置了一个名为

的环境变量
EIGEN3_INCLUDE_DIR

指向FindEigen3.cmake所在的路径。

然后在CMakelists.txt中写道:

find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )

我收到下一条错误消息:

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)

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

10 个答案:

答案 0 :(得分:23)

由于Eigen3仅是完全标头,因此您只需要包含目录的路径。而这一个,你已经手动定义了。因此,实际上不需要FindEigen3.cmakeFIND_PACKAGE来电。

只需使用

INCLUDE_DIRECTORIES ( "$ENV{EIGEN3_INCLUDE_DIR}" )

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}" )

一些注意事项:

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

答案 1 :(得分:9)

首先,确保正确安装Eigen。请参阅tarball附带的INSTALL文件。

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

CMakeLists.txt添加:

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})

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

所有这些(主要)来自此source

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

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

答案 2 :(得分:5)

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

假定本征已使用默认设置安装到/opt/eigen/3.3。将位置/opt/eigen/3.3附加或附加到环境变量CMAKE_PREFIX_PATH上,例如在bash中:

export CMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH:/opt/eigen/3.3"

然后CMake应该拿起它。


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

find_package (Eigen3 3.3 REQUIRED)
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)

自CMake 3发布以来,您不应使用include_directories -只要有目标,应首选目标方法。

答案 3 :(得分:4)

我找到了另一个使用pkg-config文件的解决方案here(引用here):

find_package(PkgConfig)
pkg_search_module(Eigen3 REQUIRED eigen3)

答案 4 :(得分:1)

您可以尝试将CMAKE_MODULE_PATH设置为名为“cmake”的Eigen子目录的位置:

cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/

答案 5 :(得分:1)

如果您尚未将Eigen Library添加到环境变量,请在CMakeLists.txt中执行以下操作:

cmake_minimum_required(VERSION 3.9)
project(ProjectName)

set(CMAKE_CXX_STANDARD 11)

# set EIGEN_DIR variable to Eigen Library Path
set(EIGEN_DIR "C:\\Eigendir\\Eigen")

# include the directory
include_directories(${EIGEN_DIR})

add_executable(ProjectName main.cpp)

target_link_libraries(ProjectName ${EIGEN_DIR})

答案 6 :(得分:1)

另一种不需要添加环境变量的简单方法是仅使用cmake find_path函数https://cmake.org/cmake/help/v3.6/command/find_path.html查找本征。示例代码在子目录“ eigen3”中进行了附加搜索,在路径“ / usr / include /”和“ / usr / local / include”中找到目录“ Eigen”。

find_path(EIGEN3_INCLUDE_DIRS "Eigen" paths "/usr/include" "/usr/local/include" path_suffixes "eigen3")
message(${EIGEN3_INCLUDE_DIRS})
if ( NOT EIGEN3_INCLUDE_DIRS )
    message(FATAL_ERROR "CMake variable EIGEN3_INCLUDE_DIRS not found.")
endif()
include_directories ( "${EIGEN3_INCLUDE_DIRS}" )

答案 7 :(得分:1)

作为约翰内斯最佳答案中注释7 的详细说明。通过使用CMake find_packate()的“配置模式”而不是“模块模式”,仅写入

find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )
CMakeLists.txt中的

就足够了。

请参阅本征源代码目录中包含的安装指导文本文件(例如,摘录自从official website下载的eigen-3.3.7.ta​​r.gz), :

Method 2. Installing using CMake
********************************

Let's call this directory 'source_dir' (where this INSTALL file is).
Before starting, create another directory which we will call 'build_dir'.

Do:

  cd build_dir
  cmake source_dir   
  make install

The "make install" step may require administrator privileges.

You can adjust the installation destination (the "prefix")
by passing the -DCMAKE_INSTALL_PREFIX=myprefix option to cmake, as is
explained in the message that cmake prints at the end.

就像在计算机上安装常规的CMake项目一样。

与直接包含 / usr / include / eigne3 / usr / local / include / eigen3 目录的区别在于,配置目录称为 eigen3 / cmake 也将安装到 / usr / share usr / local / share 。此配置目录包含 Eigen3Config.cmake 文件,CMake可以自动找到该文件以找到eigen3目录。

答案 8 :(得分:0)

在github上的项目克隆上的Google Colab上运行cmake .. && make时,我遇到了类似的问题。我通过编辑CMakeLists.txt文件并将此行添加到其中来对其进行了修复:

set(EIGEN3_INCLUDE_DIR "/usr/include/eigen3")

如您所见,我的eigen3位于/ usr / include / eigen3路径中(并且我已经使用!sudo apt-get install build-essential cmake libeigen3-dev安装了它)

答案 9 :(得分:-1)

另一种简单的方法是:

如果Eigen库位于/opt/eigen/3.3/Eigen

include_directories(/opt/eigen/3.3)

等同于Jai的建议

set(EIGEN_DIR "/opt/eigen/3.3")
include_directories(${EIGEN_DIR})