cmake Eigen find_package СОВЕТЫ - PullRequest
       26

cmake Eigen find_package СОВЕТЫ

1 голос
/ 20 февраля 2020

Мне нужно добавить Eigen в один из наших проектов. Поскольку Eigen предназначен только для заголовков, мы решили поместить его непосредственно в каталог с исходным кодом, чтобы отслеживать его с помощью Git и убедиться, что все готово, как только вы клонируете репозиторий. Поэтому мы скачали Eigen с здесь и поместили его в каталог EIGEN внутри каталога нашего проекта.

Мы используем cmake в этом проекте. Я могу включить Eigen, используя следующий код:

find_package(Eigen3 REQUIRED)
if (Eigen3_FOUND)
    message("Eigen found")
    message("  Eigen location: ${Eigen3_DIR}")
    message("  Eigen Version: ${Eigen3_VERSION}")
    target_link_libraries (ourProject Eigen3::Eigen)
endif ()

Однако этот код находит другую версию Eigen, расположенную в /usr/local/share/eigen3/cmake.

Я хочу использовать версию Eigen, расположенную в каталоге с исходным кодом. Поэтому я попытался использовать параметр HINTS:

find_package(Eigen3 REQUIRED HINTS ./EIGEN)

, но он не работает. Моя главная проблема заключается в том, что я не знаю, какой путь мне нужно написать в HINTS. Каталог EIGEN содержит несколько других папок. Я попробовал некоторые из них, но безуспешно:

find_package(Eigen3 REQUIRED HINTS ./EIGEN/Eigen)
find_package(Eigen3 REQUIRED HINTS ./EIGEN/Eigen/src)
find_package(Eigen3 REQUIRED HINTS ./EIGEN/cmake)...

Как правильно убедиться, что cmake использует ту версию Eigen, которую я хочу?

1 Ответ

1 голос
/ 20 февраля 2020

Как и квадратные заголовки, упомянутые в комментариях, вы должны позвонить add_subdirectory() с указанием местоположения Eigen3 в вашем исходном дереве. Тогда вам не нужно будет вызывать find_package(), если вы используете только цель Eigen3::Eigen, поскольку это будет добавлено сценариями Eigen3 CMake.

Так что, если у вас было следующее дерево исходников:

- foo/
  - CMakeLists.txt    # Top-level CMakeLists file
  - eigen/            # Cloned Eigen repo
    - CMakeLists.txt
    - ...
  - foo.cpp
  - foo.hpp

Ваш файл foo / CMakeLists.txt должен содержать:

add_subdirectory(eigen)

Однако будьте осторожны, некоторые переменные CMake нельзя устанавливать без вызова find_package() - Eigen3_VERSION и Eigen3_INCLUDE_DIR например. Если вы решите вызвать find_package(), чтобы получить их, вам не нужно давать ему параметр HINTS, и вы можете указать CONFIG или NO_MODULE для go прямо в режиме конфигурации.

Тогда CMake будет искать для Eigen3Config.cmake вместо FindEigen3.cmake , который будет сгенерирован в дереве сборки Eigen.

...