0

我决定从现在开始在 RELEASE 上工作,而不是在 DEBUG 上工作。

我已将调试的相同目录/路径/附加 blabla 复制到版本中,以摆脱“未定义的......问题”

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

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

你能帮我解决这个问题吗?

4

2 回答 2

1

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

于 2013-06-17T10:05:22.633 回答
0

在项目中混合 _ITERATOR_DEBUG_LEVEL 肯定会导致灾难:您可能会遇到看似随机的崩溃、内存损坏等等。不要去那边。在某些情况下,链接器很乐意为您解决问题,不幸的是,缺少警告可能仍然会给您带来问题。

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

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

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

在绝对必须混合的情况下,您需要小心地防火墙部分程序,以便它们永远不会直接共享来自标准库的对象,仅由轻量级接口绑定,并且每个人都只处理其私有数据。

于 2013-06-17T09:49:28.110 回答