CMake RelWithDebInfo链接到调试库

jhkqcmku  于 2023-03-18  发布在  其他
关注(0)|答案(5)|浏览(222)

我有一个链接到六个库的项目,其中包括OpenCV。
由于Release variant崩溃了,而Debug工作正常(只是慢了很多),我想在RelWithDebInfo配置中编译我的项目。
但是,OpenCV库的Debug版本取代了Release(OpenCV没有RelWithDebInfo变体)。这会导致链接错误,例如:
文件库(分配对象):错误LNK2038:检测到“运行时库”不匹配:值“MDd_DynamicDebug”与MyProject.obj中的值“MD_DynamicRelease”不匹配
如何解决这个问题?

ylamdve6

ylamdve61#

解决方案:在调用FIND_PACKAGE(OpenCV)后添加到CMakeLists.txt:

set_target_properties(${OpenCV_LIBS} PROPERTIES MAP_IMPORTED_CONFIG_RELWITHDEBINFO RELEASE)
webghufk

webghufk2#

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

jhiyze9q

jhiyze9q3#

我也有这个问题;但是上面的答案都没有解决这个问题。
最后,我把这两行放在CMakeLists.txt的开头,解决了这个问题:

cmake_policy(SET CMP0091 NEW)
# Make the project use static libraries (*.lib) instead of DLLs.
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Release>")

我认为$CONFIG:Debug:Release正在发挥魔力...
天哪,
米希尔

oprakyz7

oprakyz74#

您可以使用下面的代码段禁用默认cmake发行版本的级别2优化。这仍将选择发行版opencvworld(使用完全优化构建)从未优化(尚未发布)应用程序代码。使用此功能,我们可以逐行浏览应用程序的代码,并具有完整的变量可见性。与调试构建版本一样好,但不需要与debug 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)
k0pti3hp

k0pti3hp5#

我真的遇到了“第三方库”/ OpenCVModules的问题。@dženan的回答引导我进入正确的方向,但他的解决方案并没有为我工作,然而,添加这行之前使用FIND_PACKAGE解决了我的问题:

SET(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO "RelWithDebInfo;Release;")

请注意,它会将所有内容的回退设置为Release

相关问题