Включить библиотеки DLL OpenCV с CMake - PullRequest
3 голосов
/ 13 ноября 2011

Я пытаюсь написать приложение на C ++ с использованием библиотек OpenCV.Согласно рекомендации от сопровождающих OpenCV, я использую CMake для генерации Makefile.Моя платформа - Windows 7 (64 бит).Мой компилятор - MinGW (поэтому я использую инструмент «mingw32-make» для сборки приложения).

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

DisplayImage.cpp

#include <cv.h>
#include <highgui.h>

using namespace cv;

int main( int argc, char** argv )
{
    Mat image;
    image = imread( argv[1], 1 );

    if (argc != 2 || !image.data)
    {
        printf( "No image data \n" );
        return -1;
    }

    namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
    imshow( "Display Image", image );

    waitKey(0);

    return 0;
}

CMakeLists.txt

cmake_minimum_required( VERSION 2.8 )

project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

Я использовал cmake-gui для генерацииMakefile, затем использовал mingw32-make для сборки приложения.Все отлично работает и программа компилируется без ошибок.Тем не менее, когда я пытаюсь запустить его, Windows останавливается и жалуется, что ему нужен libopencv_core231.dll.Я проверил, и эта DLL находится в моем (расположение сборки OpenCV) / bin.Как я могу заставить CMake / MinGW включить это при компиляции?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2011

скопируйте dll opencv в вашу исполняемую папку.

MACRO (COPY_DLL trgt libname)
        ADD_CUSTOM_COMMAND (
        TARGET ${trgt}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND}
        ARGS -E copy "${OPENCVDIR/bin}/${libname}.dll" ${CMAKE_CURRENT_BINARY_DIR}
    )
ENDMACRO (COPY_DLL)
1 голос
/ 24 октября 2018

В моем случае я искал что-то, работающее с использованием Visual Studio (которая поддерживает несколько конфигураций в дереве сборки), команда была бы слегка изменена.команда работает параллельно find_package( OpenCV REQUIRED )

first : получить выходную dll (создать как уникальную библиотеку opencv_world)

get_target_property(__dll_dbg opencv_world IMPORTED_LOCATION_DEBUG)
get_target_property(__dll_release opencv_world  IMPORTED_LOCATION_RELEASE)

Тогда Вы можете добавить команду:

add_custom_command(TARGET ${TARGET_NAME} POST_BUILD        # Adds a post-build event the TARGET
    COMMAND ${CMAKE_COMMAND} -E copy_if_different           # which executes "cmake - E copy_if_different..."
    "$<$<CONFIG:debug>:${__dll_dbg}>$<$<CONFIG:release>:${__dll_release}>"      # <--this is in-file
    $<TARGET_FILE_DIR:${TARGET_NAME}>                        # <--this is out-file path
        # another dll copy if needed here
    COMMENT "    [1718_34_ATK] copy dlls realsense2 and opencv_world")
...