【问题标题】:Include OpenCV library dll's with CMake在 CMake 中包含 OpenCV 库 dll
【发布时间】:2011-11-13 02:22:35
【问题描述】:

我正在尝试使用 OpenCV 库编写 C++ 应用程序。根据 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 包含此内容?

【问题讨论】:

    标签: c++ dll opencv cmake mingw


    【解决方案1】:

    将 opencv dll 复制到您的可执行文件夹中。

    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)
    

    【讨论】:

    • CMake 不应该为我包含带有 dll 的目录,这样我就不必将它们复制到每个可执行文件夹中了吗?
    • 不是 CMakes 的问题。操作系统正在搜索所需的 dll。
    • 是的,但 CMake 不应该告诉可执行文件在哪里可以找到它们吗?
    • 应用程序加载器将加载可执行文件和所需的 dll。您不能在 exe 文件中指定它应该从指定文件夹加载 dll。加载器将在系统文件夹、PATH、当前工作目录中搜索dll...
    • 我同意 astay。 CMake 应该能够告诉 Visual Studio 将某些路径(例如,包含所需的 dll)添加到 PATH 环境变量。目前,手动添加这些路径很痛苦。
    【解决方案2】:

    在我的例子中,我寻找使用 Visual Studio(它支持构建树中的多个配置)工作的东西,该命令将稍作修改。 该命令与find_package( OpenCV REQUIRED ) 并行工作

    first:获取输出dll(构建为唯一的opencv_world lib)

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

    【讨论】:

    • 在OpenCV构建过程中,这个属性值__dll_dbg在哪里可以找到?
    【解决方案3】:

    我使用configure_file(...) 复制指定的.dll 文件,当它们更改(很少)用于使用${_OpenCV_LIB_PATH} 的正确编译器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-09
      • 2018-03-15
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多