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