Как CMake находит пакеты - PullRequest
       6

Как CMake находит пакеты

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

У меня есть CMake, который добавляет OpenCV в проект.

Я добавляю openCV в проект, используя этот код:

if (MSVC)
        file(TO_CMAKE_PATH $ENV{OPENCV_ROOT} OpenCV_DIR)
        IF(NOT OpenCV_DIR)
            MESSAGE( FATAL_ERROR "Please point the environment variable OpenCV_ROOT to the root directory of OpenCV installation. required openCv V 4.2.x as minimum")
        ENDIF()
        set(BUILD_SHARED_LIBS OFF)
        find_package(OpenCV 4.2.0 REQUIRED)
    else (MSVC)
        set(BUILD_SHARED_LIBS ON)
        find_package(OpenCV COMPONENTS core highgui imgproc imgcodecs videoio photo stitching flann ml features2d calib3d objdetect REQUIRED)
    endif(MSVC)

Если я не определяю переменную среды OpenCV_ root CMake не может найти OpenCV, и если я его определю, я получаю это предупреждение:

CMake Warning (dev) at CMakeLists.txt:36 (find_package):
  Policy CMP0074 is not set: find_package uses <PackageName>_ROOT variables.
  Run "cmake --help-policy CMP0074" for policy details.  Use the cmake_policy
  command to set the policy and suppress this warning.

  Environment variable OpenCV_ROOT is set to:

    D:\local\opencv

  For compatibility, CMake is ignoring the variable.
This warning is for project developers.  Use -Wno-dev to suppress it.

Так как CMake должен найти OpenCV, если я не определил переменную среды openCV_ root?

Тот же вопрос также действителен для других пакетов (например, boost, о котором я получаю то же предупреждение), следует ли нам определять переменную env или нет?

, если я не определяю переменную env как OpenCV найдет пакет?

1 Ответ

2 голосов
/ 28 февраля 2020

Описание политики политики CMP0074 говорит:

В CMake 3.12 и выше команда find_package(<PackageName>) теперь ищет префиксы, заданные переменной <PackageName>_ROOT CMake и <PackageName>_ROOT переменная окружения ... Эта политика обеспечивает совместимость с проектами, которые не были обновлены, чтобы избежать использования <PackageName>_ROOT переменных для других целей.

То есть в вашем проекте необходимо исключить использование OPENCV_ROOT переменная для целей, отличных от напрямую , влияющих на поведение find_package(OpenCV).

В более новом CMake эта переменная используется автоматически :

# This sets CMP0074 to NEW.
cmake_minimum_required(VERSION 3.12) # Or bigger version
set(BUILD_SHARED_LIBS OFF)
# If `OPENCV_ROOT` variable is set, it will be used in the next call without a warning.
find_package(OpenCV 4.2.0 REQUIRED)

Если вы хотите, чтобы ваш проект имел подсказку об установке OpenCV для других целей, используйте переменную с другим именем.

# We want to support old CMake versions too!
cmake_minimum_required(VERSION 3.11) # Or lower version

# Use `OPENCV_INSTALL_PREFIX` environment variable for set `OpenCV_DIR`, which helps CMake to find OpenCV.
# This setting works for both new and old CMake versions.
file(TO_CMAKE_PATH $ENV{OPENCV_INSTALL_PREFIX} OpenCV_DIR)
IF(NOT OpenCV_DIR)
    MESSAGE( FATAL_ERROR "Please point the environment variable OPENCV_INSTALL_PREFIX to the root directory of OpenCV installation. required openCv V 4.2.x as minimum")
ENDIF()
set(BUILD_SHARED_LIBS OFF)
find_package(OpenCV 4.2.0 REQUIRED)

В качестве альтернативы вы можете отключить политику CMP0074 и использовать переменную OPENCV_ ROOT для ваших целей. Но это не рекомендуется :

# 'find_package' won't use `_ROOT` variable. This suppress the corresponding warning. 
cmake_policy(SET CMP0074 OLD)
file(TO_CMAKE_PATH $ENV{OPENCV_ROOT} OpenCV_DIR)
IF(NOT OpenCV_DIR)
    MESSAGE( FATAL_ERROR "Please point the environment variable OpenCV_ROOT to the root directory of OpenCV installation. required openCv V 4.2.x as minimum")
ENDIF()
set(BUILD_SHARED_LIBS OFF)
find_package(OpenCV 4.2.0 REQUIRED)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...