Я использую 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, не так ли?
Среды:
первая среда (работает нормально) - это контейнер докеров на основе Ubuntu 18.04 , используемый для непрерывной интеграции с GitLab CI; образ снабжен некоторыми основными инструментами разработки и сторонней библиотекой, которую я использую
вторая среда (пакет не может быть найден; пропущены пути поиска) - это Подсистема Windows Ubuntu 18.04 для linux , используемая для локальной разработки (новая настройка, следуя инструкциям образа Docker)
В обеих средах установлены одинаковые программные пакеты, включая cmake из репозиториев Ubuntu (CMake 3.10.2). Библиотека, которую я хочу использовать с find_package
, была собрана с помощью CMake и установлена одинаково в обеих средах. Содержимое каталога библиотеки в двух средах одинаковое.
Я также пытался обновить CMake во второй среде до 3.10.3 и 3.12.4 (оба раза собраны из исходников), но проблема осталась прежней.