_ITERATOR DEBUG LEVEL混乱?

时间:2013-06-17 09:13:41

标签: c++ visual-studio-2010 qt debugging opencv

我决定从现在起开始使用RELEASE而不是DEBUG。

我已经将Debug的相同目录/路径/附加blabla复制到了Release中,以摆脱“”未定义...问题“”

但我仍然有以下错误/警告:

Error   3   error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '1' in ex4.obj  C:\...\ex\qtmaind.lib(qtmain_win.obj)
Warning 4   warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library   C:\...\ex\MSVCRT.lib(cinitexe.obj)
Error   5   error LNK1319: 1 mismatches detected    C:\...\Win32\Release\\ex.exe    1

你能帮我解决一下吗?

2 个答案:

答案 0 :(得分:1)

使用MSVC在Debug和Release版本之间进行更改时,需要更改链接到的C运行时版本。即改变/MDd - > /MD/MTd - > /MT

答案 1 :(得分:0)

在项目中混合_ITERATOR_DEBUG_LEVEL确定了灾难的秘诀:你可以获得随机的崩溃,内存损坏等等。不要去那儿。在某些情况下,链接器很适合你,不幸的是,缺少警告可能会让你有问题。

唯一真正的解决方法是使用统一选项进行编译。 (当然包括_ITERATOR_DEBUG_LEVEL,但其他设置也可能导致问题。)

问题的根源在于您包含的标题包含#if部分,因此使用不同的设置编译不同的代码。这称为违反ODR ,即一个定义规则。这会以未定义的行为惩罚您,甚至不需要诊断。

一个例子,代码的一部分可能认为向量大小为16字节,其他24字节。迭代器的指针位于偏移量0,其他指针位于偏移量8。

如果mix是绝对必须的,你需要仔细考虑程序的防火墙部分,以便它们不会直接从标准库共享对象,只能通过轻量级接口绑定,每个人只处理其私有数据。