33

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)

知道我错过了什么或做错了什么吗?

4

11 回答 11

39

由于 Eigen3 完全只是标题,因此您只需要包含目录的路径。而这个,无论如何你已经在手动定义了。所以没有真正需要FindEigen3.cmakeorFIND_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> ...)正常使用。有关详细信息,请参阅FIND_PACKAGE的文档。
于 2012-09-04T07:40:54.857 回答
23

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"

然后 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- 只要可用,应该首选目标方法。

于 2018-09-07T22:12:24.967 回答
11

首先,确保 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})

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

所有这些(大部分)都来自这个来源

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

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

于 2015-04-02T23:21:53.250 回答
4

我在这里找到了另一个使用 pkg-config 文件的解决方案(在此处引用) :

find_package(PkgConfig)
pkg_search_module(Eigen3 REQUIRED eigen3)
于 2015-11-22T00:29:01.447 回答
3

如果您尚未将 Eigen 库添加到环境变量中,请执行以下操作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})
于 2018-04-28T20:46:03.653 回答
3

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

find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )

在 CMakeLists.txt 中就足够了。

请参考eigen源代码目录下的INSTALL指导文本文件(如从官网下载的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/shareusr/local/share。该配置目录包含Eigen3Config.cmake文件,CMake可以自动找到该文件来定位eigen3目录。

于 2020-01-01T11:46:41.090 回答
1

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

cmake . -DCMAKE_MODULE_PATH=<Eigen root dir>/cmake/
于 2012-09-04T00:46:13.027 回答
1

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

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}" )
于 2019-09-07T02:50:43.893 回答
1

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

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

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

于 2020-10-03T21:00:21.827 回答
0

在 Kubuntu 20.04 上安装时,请遵循 INSTALL 中的步骤:

做:

cd build_dir cmake source_dir make install

使用 -DCMAKE_INSTALL_PREFIX=/usr/local/eigen-3.4.0 和 sudo FindEigen3.cmake 未安装。但是,使用

设置(Eigen3_DIR“/usr/local/eigen/share/eigen3/cmake”)

似乎工作。FindEigen3.cmake 位于构建目录中,但未复制到安装目录树中。

于 2021-08-30T15:57:07.043 回答
-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})
于 2018-12-05T20:31:03.110 回答