Nano Hash - криптовалюты, майнинг, программирование

cmake Eigen find_package СОВЕТЫ

Мне нужно добавить 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)

Но это не работает. Моя основная проблема в том, что я не знаю, какой путь я должен прописать в ПОДСКАЗКИ. Каталог 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?

20.02.2020

  • Рассматривали ли вы возможность найти репозиторий Eigen с помощью add_subdirectory(EIGEN)? 20.02.2020
  • Поэтому пробовал использовать опцию ПОДСКАЗКИ... но она не работает. - Описание это не работает не очень полезно. Что точно вы наблюдаете при этой попытке? Результат find_package не изменился? Или CMake выдает ошибку? 21.02.2020
  • @Tsyvarev не меняет выбранную версию Eigen. Он всегда выбирает версию /usr/local/share/eigen3/cmake 21.02.2020

Ответы:


1

Как и в случае с квадратными скиттлами, упомянутыми в комментариях, вы должны вызывать 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, чтобы сразу перейти в режим Config.

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

20.02.2020
  • Если Eigen добавляется через add_subdirectory(), исходный код Eigen по существу будет частью вашего текущего проекта (и текущего вызова CMake), а на цели/переменные Eigen можно ссылаться напрямую. В таком случае вам вообще не понадобится find_package(), верно? 20.02.2020
  • @squarekittles Вы действительно правы. Цель Eigen3::Eigen будет добавлена ​​независимо от того, звоните ли вы find_package() или нет. Однако в несовременном CMake, где мы использовали include_directories с ‹package›_INCLUDE_DIR, это не будет работать, поскольку эта переменная не добавляется до тех пор, пока файл *Config.cmake не будет обработан из того, что я видел, поэтому далеко. Я отредактирую ответ. 20.02.2020
  • @Pesho_T Я пытался использовать add_subdirectoy(), но это не сработало. Я попробовал это так: add_subdirectory(EIGEN/Eigen) и получил следующее сообщение об ошибке: CMake Error at EIGEN/Eigen/CMakeLists.txt:1 (include): include не удалось найти файл загрузки: RegexUtils... 21.02.2020
  • @user7431005 user7431005 Есть ли у вас каталог EIGEN на том же уровне каталога, что и файл CMakeLists.txt, в который вы добавили add_subdirectory(), и содержит ли он каталог Eigen, содержащий файл CMakeLists.txt? Ознакомьтесь с документацией о рассматриваемой команде и моей последней редактировать, надеюсь, этого будет достаточно, чтобы вы начали. 21.02.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..