在CMake中包含OpenCV库dll

fdbelqdn  于 2023-02-16  发布在  其他
关注(0)|答案(4)|浏览(187)

我正在尝试使用OpenCV库编写一个C++应用程序。根据OpenCV维护人员的建议,我正在使用CMake生成Makefile。我的平台是Windows 7(64位)。我的编译器是MinGW(因此我正在使用“mingw 32-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,然后使用mingw 32-make构建应用程序。一切正常,程序编译时没有错误。但是,当我尝试运行它时,Windows停止并抱怨它需要libopencv_core231.dll。我检查了一下,这个dll在我的(OpenCV Build location)/bin目录中。我如何让CMake/MinGW在编译时包含它?

zbwhf8kr

zbwhf8kr1#

复制opencv dlls到你的可执行文件夹.

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)
q3aa0525

q3aa05252#

在我的例子中,我使用visual Studio(它支持构建树中的多个配置)寻找一些工作的东西,该命令将被稍微修改。

第一个:获取输出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")
nzrxty8p

nzrxty8p3#

我使用configure_file(...),当指定的.dll文件更改(很少)时,它会复制这些文件,以使用${_OpenCV_LIB_PATH}进行正确的编译。

find_package(OpenCV REQUIRED)
configure_file("${_OpenCV_LIB_PATH}/opencv_world451d.dll" ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
mu0hgdu0

mu0hgdu04#

下面是我想出的解决方案:
opencv_world470.dll已经在我的路径,而我正在开发,所以当启动调试器或应用程序本地,我是确定的。
现在进行安装,使用WIX或NSIS进行cpack,从目标opencv_world获取属性,以了解设备上的dll位置,以便稍后将其打包--当然还有opencv的许可证文件...

find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

# it took me forever to figure this one out
get_target_property(opencv_world_dll_source_filepath opencv_world IMPORTED_LOCATION_RELEASE)
install(FILES ${opencv_world_dll_source_filepath} DESTINATION bin)

相关问题