CMake find_package 不适用于本征?
Posted
技术标签:
【中文标题】CMake find_package 不适用于本征?【英文标题】:CMake find_package not working for Eigen? 【发布时间】:2018-12-31 22:16:34 【问题描述】:我目前正在使用 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 正在运行带有 CMake 3.12 和 Eigen3 debian 软件包的 Ubuntu 16.04,而我的 Mac 正在运行带有通过自制软件安装的 Eigen 的 CMake 3.13。我真的很困惑为什么 CMake 的行为不同。
【问题讨论】:
【参考方案1】:您没有提到每种情况下使用的是哪个版本的 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)
就可以了。
【讨论】:
是的,它是 3.3 beta 版本,感谢您的澄清!有机会我会试试的。 好吧,如何将旧版本别名为新版本?【参考方案2】:使用 Ubuntu 16.04 对我有用的是删除 target_link_libraries(KFilter Eigen3::Eigen)
并在我的源文件中更改以下行 #include <eigen3/Eigen/Dense>
【讨论】:
以上是关于CMake find_package 不适用于本征?的主要内容,如果未能解决你的问题,请参考以下文章
用于 Win32 平台的 CMake find_package(PythonInterp 3.7 REQUIRED)