Использовать цели модуля CMake OpenCV вместо непосредственного включения всех библиотек? - PullRequest
0 голосов
/ 11 апреля 2019

Проблема: у меня есть проект, который использует OpenCV. Я могу переключиться на последнюю версию, если это будет необходимо. Мой проект использует CMake. В настоящее время я интегрирую opencv так:

# OPENCV package
find_package(OpenCV)
add_library(opencv INTERFACE)
target_include_directories(opencv
        INTERFACE
        ${OpenCV_INCLUDE_DIRS})
target_link_libraries(opencv
        INTERFACE
        ${OpenCV_LIBS})

add_executable(opencv_example example.cpp)

target_link_libraries(opencv_example 
    PRIVATE 
        opencv
)

Я не могу найти примеры OpenCV, использующих явные цели зависимости модуля. Для того, чтобы не нарушать глобальность, включайте необязательно или оставляйте обнаженные переменные вокруг себя. Я создаю интерфейсную цель для OpenCV и использую эту интерфейсную цель вместо того, что OpenCV CMake рекомендует для :

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)

# Declare the executable target built from your sources
add_executable(opencv_example example.cpp)

# Link your application with OpenCV libraries
target_link_libraries(opencv_example ${OpenCV_LIBS})

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

пример (см. Список модулей здесь ):

...

add_executable(opencv_example example.cpp)

target_link_libraries(opencv_example 
    PRIVATE
        opencv::core 
        opencv::video
        opencv::imgproc
)

таким образом, я получаю только зависимости, необходимые для модулей, которые я на самом деле использую. Я просмотрел репозиторий OpenCV, но он полон пользовательских макросов и функций cmake, и трудно увидеть, где объявлена ​​цель, не говоря уже о том, можно ли получить к ней доступ из find_package.

1 Ответ

0 голосов
/ 30 апреля 2019

Хотя opencv::module не работает, если вы используете find_package, начиная с максимально OpenCV3.2 (возможно, он был доступен ранее), вы можете использовать цели типа opencv_module, например, с:

find_package(OpenCV REQUIRED COMPONENTS core imgproc video)

add_executable(opencv_example example.cpp)

target_link_libraries(opencv_example 
    PRIVATE
        opencv_core 
        opencv_video
        opencv_imgproc
)

Я обнаружил, что эти цели были экспортированы здесь: https://github.com/opencv/opencv/issues/8028#issuecomment-273419374

...