我可以将OpenCV的Release配置与我的应用程序的Debug配置一起使用吗

Can I use a Release config of OpenCV with Debug config of my app?

本文关键字:配置 一起 Debug 应用程序 OpenCV Release 我可以 我的      更新时间:2023-10-16

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

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

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

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

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

对于应用程序的Release构建配置,您可以禁用优化。这仍然会从未优化的(release 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)

OpenCV的构建文件夹中有两种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动态地包含我的lib。以下是我使用预处理器来解决这个问题并动态加载lib的方法。

#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