首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找用于Eigen3的包CMake

查找用于Eigen3的包CMake
EN

Stack Overflow用户
提问于 2012-09-03 13:48:02
回答 10查看 109.9K关注 0票数 35

CMake找不到我的Eigen3包。我设置了一个环境变量,称为

代码语言:javascript
复制
EIGEN3_INCLUDE_DIR

指向FindEigen3.cmake所在的路径。

然后我在CMakelists.txt中写道:

代码语言:javascript
复制
find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )

我收到了下一条错误信息:

代码语言:javascript
复制
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)

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-09-04 07:40:54

因为Eigen3是完全标头的,所以您所需要的只是包含目录的路径。这一次,你已经在手动定义了。因此,不需要FindEigen3.cmakeFIND_PACKAGE调用。

简单地使用

代码语言:javascript
复制
INCLUDE_DIRECTORIES ( "$ENV{EIGEN3_INCLUDE_DIR}" )

代码语言:javascript
复制
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> ...)。详情请参见包装
票数 41
EN

Stack Overflow用户

发布于 2018-09-07 22:12:24

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

假设/opt/eigen/3.3已安装了带有默认设置的特征。在bash中将位置/opt/eigen/3.3追加或放在环境变量CMAKE_PREFIX_PATH的前面:

代码语言:javascript
复制
export CMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH:/opt/eigen/3.3"

那么CMake应该把它捡起来。

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

代码语言:javascript
复制
find_package (Eigen3 3.3 REQUIRED)
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)

您不应该使用include_directories,因为CMake 3已经发布--在可用的时候,目标方法应该是首选的。

票数 25
EN

Stack Overflow用户

发布于 2015-04-02 23:21:53

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

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

在您的CMakeLists.txt中添加:

代码语言:javascript
复制
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机制访问,而不需要任何额外的路径,那就太好了。)

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12249140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档