我可以将OpenCV的Release配置与我的应用程序的Debug配置一起使用吗
Can I use a Release config of OpenCV with Debug config of my app?
我正在编写一个通用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.dll
和opencv_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
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 无法找到/读取配置文件.conf-FileIOException
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 如何将C++中的库和头与MinGW一起使用
- 一种在C++中读取TXT配置文件的简单方法
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 生成MRPT库时cmake配置失败
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 我应该如何获取配置文件的绝对路径与 Windows .exe一起发布?
- 我如何配置我的cmake文件以与Google Test和CTEST一起使用
- 将 boost-di 与配置文件和共享库一起使用
- QT项目在配置文件上崩溃,与发布和调试器一起运行
- 我可以将OpenCV的Release配置与我的应用程序的Debug配置一起使用吗
- Visual Studio 2010 默认属性表似乎在调试和发布配置下都链接在一起,这是怎么回事?
- 无法将splitterChannel与高级xml配置一起使用