CMake find_package использует разные пути поиска в разных средах - PullRequest
0 голосов
/ 15 ноября 2018

Я использую CMake 3.10.2 для проекта C ++ и испытываю странное поведение CMake, когда требуется сторонний пакет библиотеки и запускаю CMake в разных средах: мне нужна библиотека (которую я здесь называю SOME_LIB) через

find_package(SOME_LIB REQUIRED)

и пути поиска отличаются (пути, где CMake ищет пакеты), хотя вызов CMake одинаков в обеих средах. Оба раза вызывается CMake с некоторыми параметрами, один из которых

-DSOME_LIB_DIR=/path/to/lib

с указанием пути установки пакета.

В первой среде это работает нормально, но во второй системе библиотека не найдена:

CMake Warning at CMakeLists.txt:123 (find_package):
  By not providing "FindSOME_LIB.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "SOME_LIB", but
  CMake did not find one.

  Could not find a package configuration file provided by "SOME_LIB" with any of
  the following names:

    SOME_LIBConfig.cmake
    SOME_LIB-config.cmake

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

Добавление опции

 -DCMAKE_FIND_DEBUG_MODE=ON

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

<prefix>/                                                       (W)
<prefix>/(cmake|CMake)/                                         (W)
<prefix>/<name>*/                                               (W)
<prefix>/<name>*/(cmake|CMake)/                                 (W)
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/                  (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/                        (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/          (U)
<prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/          (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/                (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (W/U)

Так как шаблон поиска <prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ был бы тем, который находит пакет в моей ситуации, я сначала думал, что вторая система не распознается как unix-подобная система, но в документации также говорится, что «Это просто соглашение, поэтому все (W) и (U) каталоги по-прежнему ищутся на всех платформах ". Так что я должен видеть все пути в выводе отладки CMake, не так ли?

Среды:

  1. первая среда (работает нормально) - это контейнер докеров на основе Ubuntu 18.04 , используемый для непрерывной интеграции с GitLab CI; образ снабжен некоторыми основными инструментами разработки и сторонней библиотекой, которую я использую

  2. вторая среда (пакет не может быть найден; пропущены пути поиска) - это Подсистема Windows Ubuntu 18.04 для linux , используемая для локальной разработки (новая настройка, следуя инструкциям образа Docker)

В обеих средах установлены одинаковые программные пакеты, включая cmake из репозиториев Ubuntu (CMake 3.10.2). Библиотека, которую я хочу использовать с find_package, была собрана с помощью CMake и установлена ​​одинаково в обеих средах. Содержимое каталога библиотеки в двух средах одинаковое.

Я также пытался обновить CMake во второй среде до 3.10.3 и 3.12.4 (оба раза собраны из исходников), но проблема осталась прежней.

1 Ответ

0 голосов
/ 15 ноября 2018

Комментарий Цыварева привел меня к ответу на мою проблему:

Проблема была вызвана моим неправильным пониманием

-D<PACKAGE>_DIR=/path/to/config

параметр. Как указал Цыварев, в документации сказано, что <PACKAGE>_DIR должен указывать точный путь к каталогу, содержащему файлы конфигурации <PACKAGE>-config.cmake. Другими словами, это не префиксный путь.

Остается вопрос, почему он работал в одной из двух сред: причина в том, что у меня было небольшое, но важное различие между путями установки библиотеки в обеих средах, которое я раньше не замечал:

  1. Первая среда (док-контейнер): /opt/<library_name>-<version-number>/ (обратите внимание на -, что важно!)
  2. Вторая среда (подсистема Windows для Linux Ubuntu): /opt/<library_name>/<version-number>/

Примечание: оба пути содержали одинаковое содержимое с конфигурацией CMake в

  1. /opt/<library_name>-<version-number>/lib/cmake/<library_name>/<library_name>-config.cmake для первой среды и соответственно в
  2. /opt/<library_name>/<version-number>/lib/cmake/<library_name>/<library_name>-config.cmake для второй среды.

В первой среде библиотека была найдена, поскольку совпал шаблон <prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/, где /opt является одним из путей <prefix> CMake, а <name>* был расширен до <library_name>-<version-number> - расширение, которое было невозможно путь во втором окружении.

Большое спасибо за полезные комментарии. Приношу свои извинения за то, что пропустил изменение пути (рассматривал проблему в течение двух дней, но не видел этого).

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