我可以将 OpenCV 的发布配置与我的应用程序的调试配置一起使用吗?

Eva*_*ang 10 c++ debugging opencv cmake uwp

我正在编写一个通用 Windows 应用程序,它使用 OpenCV 进行相机校准和标签检测等。

我希望能够在我自己的 DLL 处于调试模式时使用发布模式、完全优化的 OpenCV DLL。这可能吗?如果是这样,我如何配置 CMake 来实现它?

当然,我确实想调试我自己的应用程序。但是,我不想调试 OpenCV 本身。我不想处理 OpenCV 调试构建的性能下降,即使是在调试自己的项目时也是如此。我不想处理额外的库和 dll 的开销,也不想正确设置我的构建配置(这是一个更大项目的一部分,包括 Unity 应用程序,因此构建配置是一个重要问题)。

我使用的是 OpenCV DLL,而不是静态库,因此 STD 库的实现差异问题等不应产生任何影响(除非 OpenCV 跨 DLL 边界传递这些问题......这确实很顽皮)。然而,当我尝试在调试模式下构建应用程序时,在引用 OpenCV Release DLL 时,我遇到了 debug_build_guard:

error LNK2019: unresolved external symbol "bool __cdecl cv::imencode(class cv::String const &,class cv::debug_build_guard::_InputArray const &,...
Run Code Online (Sandbox Code Playgroud)

看来我想要的是一个非常常见的用例。不幸的是我似乎无法在任何地方找到任何有关它的信息。谢谢你的帮助!

小智 5

添加CV_IGNORE_DEBUG_BUILD_GUARD为预处理器定义之一,其定义在/path/to/opencv/opencv2/core/cvdef.h


Ami*_*mir 0

OpenCV 的 build 文件夹中有两种 DLL/LIB。

释放 DLL/LIB: 在这些文件中,调试防护被激活。例如,在版本 4.01 中,DLL 是opencv_world401.dll,关联的 LIB 是opencv_world401.lib

调试 DLL/LIB: 这些是为调试目的而设计的,其名称以d结尾(例如opencv_world401d.dllopencv_world401d.lib)。

您需要在调试模式下将调试DLL和关联的LIB添加到链接器中。

我不使用 CMAKE,而是#pragma动态包含我的库。这是我使用预处理器来解决这个问题并动态加载我的库的方法。

#include <opencv2/opencv.hpp>            
#include "opencv2/core/version.hpp"
#include "opencv2/videoio/videoio.hpp"
#define OPENCV_VERSION CVAUX_STR(CV_VERSION_MAJOR)"" CVAUX_STR(CV_VERSION_MINOR)"" CVAUX_STR(CV_VERSION_REVISION)
#if NDEBUG 
#pragma comment(lib, "opencv_world" OPENCV_VERSION ".lib")
#else
#pragma comment(lib, "opencv_world" OPENCV_VERSION "d.lib")
#endif
Run Code Online (Sandbox Code Playgroud)