Команда CMake «find_package» для пакета, который не был установлен, оказалась неожиданно успешной - PullRequest
0 голосов
/ 05 февраля 2019

Я следую chapter-02 / recipe-06 в " CMake Cookbook ".Для этого конкретного примера требуются библиотеки Eigen C ++ .

. Я попытался построить пример и получил ошибку, что Eigen не был найден.

CMake Error at CMakeLists.txt:9 (find_package):
  Could not find a package configuration file provided by "Eigen3" (requested
  version 3.3) with any of the following names:

    Eigen3Config.cmake
    eigen3-config.cmake

  Add the installation prefix of "Eigen3" to CMAKE_PREFIX_PATH or set
  "Eigen3_DIR" to a directory containing one of the above files.  If "Eigen3"
  provides a separate development package or SDK, be sure it has been
  installed.

Это ожидалось, потому чтобиблиотека не была установлена ​​в моей системе.

Затем я скачал файл ".zip" для библиотек Eigen и разархивировал его в произвольное место за пределами моего проекта.Я создал папку "build" в каталоге Eigen и запустил cmake .. в папке "build". (Я только запускал cmake - я НЕ собирал и не устанавливал пакет.)


После запуска CMake в каталоге сборки Eigen я вернулся к примеру кода для "recipe"-06 "и он волшебным образом смог найти библиотеку Eigen и успешно ее построить, хотя Eigen никогда не собирался и не устанавливался.

Каким-то образом просто запуск CMake в проекте Eigen заставил CMake узнать о местонахождении библиотек Eigen.После этого любые проекты, которые делают find_package для поиска Eigen3, каким-то образом определяют переменную ${Eigen3_DIR} и могут ее найти.


Просматривая документацию CMake для find_package Я неНе вижу объяснения, почему это работает.Эйгена нет ни в одном из типичных мест, которые find_package ищет.В соответствии с документацией похоже, что она НЕ должна быть найдена.

Еще интереснее - не имеет значения, где я размещаю Eigen в моей системе.Я могу поместить его буквально в любом месте, и он все равно найдет его.

Согласно всему, что я вижу в документации, его не должно быть найдено ... но оно найдено.Итак, вопрос в том, как?Почему это работает?

Дополнительная информация: Я использую CMake версии 3.13.3

1 Ответ

0 голосов
/ 05 февраля 2019

Существует 2 "источника" XXXConfig.cmake файлов, которые используются внутренне при вызове find_package().

Обычно, файл XXXConfig.cmake создается, когда проект установлен , ифайл содержит информацию об установленных библиотеках и заголовках.

Но CMake также предоставляет команду export () , которая позволяет экспортировать дерево сборки .

export(PACKAGE <name>)

Сохранить текущий каталог сборки в реестре пользовательских пакетов CMake для пакета <name>.Команда find_package может учитывать каталог при поиске пакета <name>.

Eigen's CMakeLists.txt использует команду export(), поэтому проект становится обнаружимым с помощью find_package сразу после запуска cmake для Эйгена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...