CMake find_package не работает для Eigen? - PullRequest
0 голосов
/ 01 января 2019

В настоящее время я разрабатываю библиотеку Kalman Filtering с использованием 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?

Почему я получаю эту ошибку в строке 5, когда find_package кажется успешным?Я следую этому руководству с сайта Eigen.

Travis CI работает под управлением Ubuntu 16.04 с CMake 3.12 и пакетом Debian Eigen3, в то время как мой Mac работает под управлением CMake 3.13 с Eigen, установленной через homebrew,Я действительно не понимаю, почему CMake ведет себя по-другому.

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Что мне помогло с использованием Ubuntu 16.04, так это удалить target_link_libraries(KFilter Eigen3::Eigen) и изменить в моем исходном файле следующую строку #include <eigen3/Eigen/Dense>

0 голосов
/ 01 января 2019

Вы не упоминаете, какая версия 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 не экспортировали Eigen3::Eigen3он содержит:

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

Так что просто удалите target_link_libraries(KFilter Eigen3::Eigen) и все будет хорошо.

...