C++ CMake RelWithDebInfo链接到调试库

C++ CMake RelWithDebInfo链接到调试库,c++,opencv,linker,cmake,C++,Opencv,Linker,Cmake,我有一个项目链接到六个库,其中包括OpenCV。 由于发行版变体正在崩溃,而调试工作正常(只是慢了很多),所以我想在RelWithDebInfo配置中编译我的项目。 但是,将包含OpenCV库的Debug版本,而不是Release(OpenCV没有RelWithDebInfo变体)。这会导致链接错误,例如: opencv_core249d.lib(alloc.obj):错误LNK2038:检测到“RuntimeLibrary”不匹配:值“MDd_DynamicDebug”与MyProject.o

我有一个项目链接到六个库,其中包括OpenCV。
由于发行版变体正在崩溃,而调试工作正常(只是慢了很多),所以我想在
RelWithDebInfo
配置中编译我的项目。
但是,将包含OpenCV库的
Debug
版本,而不是
Release
(OpenCV没有
RelWithDebInfo
变体)。这会导致链接错误,例如:

opencv_core249d.lib(alloc.obj):错误LNK2038:检测到“RuntimeLibrary”不匹配:值“MDd_DynamicDebug”与MyProject.obj中的值“MD_dynamiccrease”不匹配


如何解决此问题?

解决方案:在调用
FIND\u PACKAGE(OpenCV)
后,添加到CMakeLists.txt:


我使用了迪南的上述答案,但发现一些opencv库忽略了这一点,仍然链接调试!这将产生一个msvc项目,该项目链接opencv的混合发布和调试库。我的解决方案是在opencv安装的lib dir中创建一个新的OpenCVModules-relwithdebinfo.cmake,它是OpenCVModules-release.cmake文件的副本。然后用RELWITHDEBINFO替换对RELEASE的所有引用。
这将生成一个完全链接到opencv发布库的msvc项目。附加的好处是,您不需要更改项目的CMake文件来说明这一点。

您可以使用下面的代码片段禁用默认CMake发布版本的2级优化。这仍然会从未优化(尚未发布)的应用程序代码中选择opencvworld(完全优化的构建)。使用此功能,我们可以以完全可变的可见性逐行浏览应用程序的代码。。与调试构建一样,不需要与调试opencv链接,也不需要混合CRT,也不需要对所有涉及的组件进行完整的调试构建

if (WIN32)

  SET (CMAKE_CXX_FLAGS_RELEASE "/Zi /Od")

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

endif (WIN32)

我通过从不在windows中使用安装目标来解决这个问题。而是将PROJECTNAME_DIR变量指向构建库的根文件夹。我还使用我正在使用的编译器构建所有依赖项,从不使用二进制软件包。如果您从源代码构建opencv,它是否仍然消除了RelWithDebInfo配置?我已经从源代码构建了opencv。我对预编译的OpenCV没有这个问题。这节省了我大量的搜索和工作。谢谢:)这对我来说大部分时间都有效,但有些目标仍然作为调试库提供。我已经列出了每一个可能的opencv目标,以确保它也得到依赖目标。@DanielMoodie你是怎么做到的?最新版本的OpenCV需要protobuf依赖关系(
OpenCV\u dnn
module)。无论我如何配置
MAP\u IMPORTED\u CONFIG
它仍会尝试将调试协议链接到我的RelWithDebInfo构建。您是否已为CMake提交错误报告?解决问题比解决问题要好,这是你的建议。我不能确定这是一个CMake问题还是OpenCV的CMake脚本的问题。我有时间的时候还在进一步调查。
if (WIN32)

  SET (CMAKE_CXX_FLAGS_RELEASE "/Zi /Od")

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

endif (WIN32)