_ITERATOR_DEBUG_LEVEL 错误

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

我正在尝试在 Windows 7 上的 Visual Studio 2010 中编译 JRTPLIB。这真是一场噩梦......但我至少缩小了问题的范围。

剩下这个了。

Error   3   error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in client.obj   C:\Users\Johan-bar\Documents\Visual Studio 2010\Projects\client\client\jrtplib.lib(rtpsession.obj)  client

我用谷歌搜索了很多,原因似乎是一个是在调试模式下编译的,而另一个是在发布模式下编译的。

我的目标是编译一个 Release 可执行文件,因为我想在不同的计算机上进行测试。

  1. JRTPLIB 和客户端(我的是正在尝试编译的那个)哪一个不是处于发布模式?

  2. 如何更改 ITERATOR_DEBUG_LEVEL?两者都使用运行时库 /MT 和预处理器定义 WIN32、_MT,以及我猜的默认值。

c++ visual-studio winapi release
3个回答
15
投票

使用 -D_ITERATOR_DEBUG_LEVEL=0 选项编译您使用的所有内容。在 VS 2010 Release 模式下默认情况下是如此,但有些东西仍然是使用其他选项构建的,因此不兼容二进制。

在较旧的视觉工作室中,有 _SECURE_SCL,我不确定某些代码是否仍然使用它。在某处(例如 stdafx.h 中)放置静态检查以确保它们匹配。

#if _ITERATOR_DEBUG_LEVEL == 0 && _SECURE_SCL != 0 
#error _SECURE_SCL != 0 when _ITERATOR_DEBUG_LEVEL == 0 
#endif 

如果您想查看 _ITERATOR_DEBUG_LEVEL 有什么值,那么您可以在代码中使用一些 #pragma 消息来告诉您。


9
投票

解决方案:

Project Pages >> Configuration Properties >> C,C++ >> Preprocessor >> Preprocessor Definitions

添加

_ITERATOR_DEBUG_LEVEL=0
在那里工作。 另请参阅:如何在 VS2010 中设置 _ITERATOR_DEBUG_LEVEL?


0
投票

我找到了另一种产生这些错误的方法。

我使用 Visual Studio 2010 批量构建来构建所有可能的平台和配置组合,但遇到了这些错误。 查看输出发现批量构建不尊重项目依赖关系 - 因此将发布构建中的陈旧库与新编译的调试 obj 文件链接起来。

在构建输出的几行后面,它构建了库的调试版本。

手动进行“批量构建”(即手动选择平台和配置的各种组合)产生了干净的构建。

道德:不要使用 Visual Studio 2010 批量构建。 我不知道他们是否在VS的更高版本中修复了这个问题。

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