混合调试和发布库/二进制 - 不好的做法?

问题描述 投票:21回答:3

在调试二进制文件中使用第三方库的发布版本是不好的做法吗?

我正在使用第三方库并编译了一个发行版.lib库。我的exe是在调试模式开发中。然后我得到了:

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test1.obj

经过一些谷歌搜索,我发现这是因为我试图将发布与调试混合,我应该在调试模式下编译库,或者与_ITERATOR_DEBUG_LEVEL宏混淆。但我很好奇,如果这是推荐的方式和原因。我需要编译并保留我打算使用的每个第三方库的发布和调试二进制文件的记录,这很麻烦,这很快就会很多,而无意调试这些代码。

c++ visual-studio-2010 visual-studio
3个回答
32
投票

混合调试和发布代码是不好的做法。问题是不同的版本可能依赖于C ++运行时库的不同基本部分,例如如何分配内存,迭代器之类的结构可能不同,可以生成额外的代码来执行操作(例如,检查迭代器)。

它与混合使用任何其他不同设置构建的库文件相同。想象一下,头文件包含应用程序和库使用的结构的情况。该库是通过将结构打包和对齐设置为一个值并使用另一个值构建的应用程序构建的。无法保证将结构从应用程序传递到库中将起作用,因为它们的大小和成员位置可能不同。

是否可以将第三方库构建为DLL?假设任何函数的接口更干净,并且不尝试传递任何STL对象,您将能够将调试应用程序与版本DLL混合而不会出现问题。


7
投票

它不编译的事实应该足以证明这是不好的做法。

关于维护单独的构建 - 您不需要这样做。这是以前适用于我的解决方法:

#ifdef _DEBUG
#define DEBUG_WAS_DEFINED
#undef _DEBUG
#endif

#include <culprit>

#ifdef DEBUG_WAS_DEFINED
#define _DEBUG
#endif

如果这对您有用,请告诉我。


0
投票

混合调试和发布库/二进制文件是很好且非常有用的实践。

调试大型解决方案(100多个项目作为示例)通常不是很快甚至根本不可能(例如,并非所有项目都可以在调试中构建)。以前的评论员写道,调试/发布二进制文件可能有不同的对齐或其他人员。这不是真的。调试和发布二进制文件中的所有链接参数都相同,因为它们依赖于相同的体系结构。

您必须从所选项目中删除所有优化(/ Od)。然后分配一个发布c ++运行时。

之所以出现此问题,是因为您已在项目中定义了_DEBUG。从定义中删除宏(项目 - >属性 - >预处理器 - >预处理器定义)。

如果宏不在预处理器定义中,则必须将其添加到“UndefinePreprocessorDefinitions”中。

© www.soinside.com 2019 - 2024. All rights reserved.