我试图在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
我googled一吨,原因似乎是一个是在调试模式下编译而另一个是在发布模式下编译。
我的目标是编译Release可执行文件,因为我想在不同的计算机上进行测试。
1)哪一个不处于发布模式,JRTPLIB或客户端(我的,正在尝试编译的那个)?
2)如何更改ITERATOR_DEBUG_LEVEL?两者都使用运行时库/ MT和预处理器定义WIN32,_MT,以及我猜的默认值。
干杯
答案 0 :(得分:12)
使用-D_ITERATOR_DEBUG_LEVEL = 0选项编译您使用的所有内容。默认情况下在VS 2010 Release模式下是这样,但有些东西仍然使用其他选项构建,因此不是二进制兼容的。
在较旧的视觉工作室中有_SECURE_SCL,我不确定某些代码是否仍然可以使用它。把某些地方(比如stdafx.h)放到这些匹配的静态检查中。
#if _ITERATOR_DEBUG_LEVEL == 0 && _SECURE_SCL != 0
#error _SECURE_SCL != 0 while _ITERATOR_DEBUG_LEVEL == 0
#endif
如果你想看看_ITERATOR_DEBUG_LEVEL有什么价值,你可以在代码中使用一些#pragma消息来告诉你。
答案 1 :(得分:8)
解决方案:
Project Pages >> Configuration Properties >> C,C++ >> Preprocessor >> Preprocessor Definitions
添加_ITERATOR_DEBUG_LEVEL=0
。
另见:How to set _ITERATOR_DEBUG_LEVEL in VS2010?
答案 2 :(得分:0)
我发现了另一种产生这些错误的方法。
我使用Visual Studio 2010批处理构建来构建平台和配置的所有可能组合,我遇到了这些错误。查看输出显示批处理构建不符合项目依赖性 - 因此使用新编译的Debug obj文件链接来自Release构建的陈旧库。
在构建输出中的几行之后,它构建了库的Debug版本。
进行"批量构建"手工(即手动选择平台和配置的各种组合)产生了干净的构建。
道德:不要使用Visual Studio 2010批量构建。我不知道他们是否已在VS的更高版本中解决此问题。