我可以使用OpenCV的Release配置和我的应用程序的Debug配置吗?

时间:2017-11-07 20:18:26

标签: c++ opencv debugging cmake uwp

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

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

我确实想自己调试自己的应用程序。但是,我不想调试OpenCV本身。我不想处理OpenCV调试版本的性能下降,即使在我调试自己的项目时也是如此。我不想处理额外的lib和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 &,...

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

2 个答案:

答案 0 :(得分:0)

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

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

调试DLL / LIB: 这些是为调试目的而设计的,优良名称以 d (例如opencv_world401d.dllopencv_world401d.iib)开头。

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

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

#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

答案 1 :(得分:0)

对于应用的发布版本配置,您可以禁用优化。这仍然会从未优化的(发行CRT)应用程序代码中选择版本opencvworld(具有完整的优化功能)。使用此功能,我们可以逐行浏览应用程序的代码,并具有完全可变的可见性。下面的内容。默认的cmake Release标志唯一不同的地方是我相信/ O2级别的优化,而不是我们在此使用的/ Od。我用它来调试我的应用程序。我从不对应用程序进行调试,也从不对opencv进行调试。效果很好。

if (WIN32)

  SET (CMAKE_CXX_FLAGS_RELEASE "/Zi /Od")

  SET_TARGET_PROPERTIES(
   xyz PROPERTIES 
   LINK_FLAGS 
   "/DEBUG /OPT:REF /OPT:ICF"
  )

endif (WIN32)