在调试二进制文件中使用第三方库的发行版本是不是很糟糕吗?
我正在使用第三方库并编译了一个发行版.lib库。我的exe是在调试模式开发中。然后我得到了:
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test1.obj
经过一些谷歌搜索后,我发现这是因为我试图将发布与调试混合,我应该在调试模式下编译库,或者与_ITERATOR_DEBUG_LEVEL宏混淆。但我很好奇,如果这是推荐的方式和原因。我需要编译并保留我打算使用的每个第三方库的发布和调试二进制文件的记录,这很麻烦,这很快就会很多,而无意调试这些代码。
答案 0 :(得分:31)
混合调试和发布代码是不好的做法。问题是不同的版本可能依赖于C ++运行时库的不同基本部分,例如如何分配内存,迭代器之类的结构可能不同,可以生成额外的代码来执行操作(例如,检查迭代器)。 / p>
与使用任何其他不同设置构建的库文件混合相同。想象一下,头文件包含应用程序和库使用的结构的情况。该库是通过将结构打包和对齐设置为一个值并使用另一个值构建的应用程序构建的。无法保证将应用程序中的结构传递到库中,因为它们的大小和成员位置可能不同。
是否可以将第三方库构建为DLL?假设任何函数的接口更干净,并且不尝试传递任何STL对象,您将能够将调试应用程序与发行版DLL混合而不会出现问题。
答案 1 :(得分:6)
它不编译的事实应足以证明这是不好的做法。
关于维护单独的构建 - 您不需要这样做。这是以前对我有用的解决方法:
#ifdef _DEBUG
#define DEBUG_WAS_DEFINED
#undef _DEBUG
#endif
#include <culprit>
#ifdef DEBUG_WAS_DEFINED
#define _DEBUG
#endif
请告诉我这是否适合您。
答案 2 :(得分:0)
混合调试和发布库/二进制文件是很好的且非常有用的做法。
调试大型解决方案(例如100个以上的项目)通常不是很快,甚至根本不可能(例如,并非所有项目都可以在debug中构建)。以前的评论者写道,调试/发布二进制文件可能具有不同的对齐方式,也可能有其他人员。这不是真的。在调试和发行二进制文件中,所有链接参数都相同,因为它们依赖于相同的体系结构。
您必须从所选项目中删除所有优化(/ Od)。然后分配一个发布c ++运行时。
问题来了,因为您在项目中定义了_DEBUG。从定义中删除宏(项目->属性->预处理器->预处理器定义)。
如果该宏不在“预处理程序定义”中,则必须在“ UndefinePreprocessorDefinitions”中添加它。