CMake find_package 不适用于 Eigen?

CMake find_package not working for Eigen?

我目前正在使用 Eigen 开发卡尔曼滤波库,并且我已经成功地将其用于我的开发 Mac。现在我正在尝试使用 Travis CI 进行设置,而 CMake 在查找包时遇到了问题。首先我 sudo apt install libeigen3-dev 然后尝试使用以下配置 运行 cmake:

cmake_minimum_required(VERSION 3.0)
project(KFilter VERSION 0.1.0)

find_package (Eigen3 REQUIRED NO_MODULE)
add_library(KFilter KFilter.cpp)
target_link_libraries(KFilter Eigen3::Eigen)

这在我的 Mac 上构建得很好,但在 Travis CI 中它会出现以下错误:

CMake Error at CMakeLists.txt:5 (add_library):
  Target "KFilter" links to target "Eigen3::Eigen" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?

当 find_package 似乎成功时,为什么我会在第 5 行收到此错误?我正在关注 Eigen 网站上的 this 指南。

Travis CI 运行ning Ubuntu 16.04 带有 CMake 3.12 和 Eigen3 debian 包,而我的 Mac 是 运行ning CMake 3.13 带有本征通过自制软件安装。我真的很困惑为什么 CMake 的行为不同。

你没有提到每种情况下使用的是哪个版本的 Eigen3。

看起来在 Eigen3 3.2 和 3.3 之间,它从使用 FindEigen3.cmake 更改为 Eigen3Config.cmake。这改变了将 Eigen3 包含到项目中的方式,在 3.3 中它使用 Eigen3::Eigen3.

但结果是 Ubuntu 16.04 包是 libeigen3-dev (3.3~beta1-2) 并且 3.3 beta 版本没有导出 Eigen3::Eigen3 相反它包含:

add_definitions     ( ${EIGEN3_DEFINITIONS} )
include_directories ( ${EIGEN3_INCLUDE_DIRS} )

所以只需删除 target_link_libraries(KFilter Eigen3::Eigen) 就可以了。

使用 Ubuntu 16.04 对我有用的是删除 target_link_libraries(KFilter Eigen3::Eigen) 并在我的源文件中更改以下行 #include <eigen3/Eigen/Dense>