CMake RelWithDebInfo 链接到调试库

Posted

技术标签:

【中文标题】CMake RelWithDebInfo 链接到调试库【英文标题】:CMake RelWithDebInfo links to Debug libs 【发布时间】:2014-06-17 11:00:47 【问题描述】:

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

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

如何解决这个问题?

【问题讨论】:

我从不在 Windows 中使用 INSTALL 目标来解决这个问题。而是将 PROJECTNAME_DIR 变量指向您构建库的根文件夹。我还使用我正在使用的编译器构建所有依赖项,并且从不使用二进制包。如果你从源代码构建 opencv 是否仍然消除了 RelWithDebInfo 配置? 我已经从源代码构建了 OpenCV。预编译的 OpenCV 没有这个问题。 【参考方案1】:

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

set_target_properties($OpenCV_LIBS PROPERTIES MAP_IMPORTED_CONFIG_RELWITHDEBINFO RELEASE)

【讨论】:

这为我节省了大量的搜索和工作。谢谢:) 这对我来说大部分时间都有效,但有些目标仍然作为调试库提供。我列出了每一个可能的 opencv 目标,以确保它也有依赖目标。 @DanielMoodie 你是怎么做到的?最新版本的 OpenCV 需要 protobuf 依赖项(opencv_dnn 模块)。不管我如何配置MAP_IMPORTED_CONFIG,它仍然会尝试将 Debug protobuf 链接到我的 RelWithDebInfo 构建。【参考方案2】:

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

【讨论】:

您是否提交了 CMake 的错误报告?解决问题比解决问题要好,这就是您的建议。 我不能确定这是 CMake 问题还是 OpenCV 的 CMake 脚本问题。有时间我还在进一步调查。【参考方案3】:

您可以使用以下 sn-p 在默认的 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)

【讨论】:

以上是关于CMake RelWithDebInfo 链接到调试库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RelWithDebInfo 模式下构建项目,依赖于 opencv 3.4.0

怎么使用CMake链接不同版本的第三方库

链接到从源代码构建的 OpenCV 时出现 Cmake 问题

CLion:Cmake 配置类型的问题

CentOS 6.4 源码安装MySQL 5.6

英特尔编译器:警告 #11021:未解决 引用于