_ITERATOR调试级别混淆
_ITERATOR DEBUG LEVEL confusion?
我已经决定从现在开始在RELEASE上工作,不再调试了。
我已经将相同的目录/路径/Debug的额外blabla复制到发布中,以摆脱"未定义的…问题"
但是我仍然有以下错误/警告:
Error 3 error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '1' in ex4.obj C:...exqtmaind.lib(qtmain_win.obj)
Warning 4 warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library C:...exMSVCRT.lib(cinitexe.obj)
Error 5 error LNK1319: 1 mismatches detected C:...Win32Release\ex.exe 1
你能帮我整理一下吗?
当您使用MSVC在调试和发布版本之间进行更改时,您需要更改链接到的C运行时的版本。即改变/MDd
-> /MD
或/MTd
-> /MT
在项目中混合_ITERATOR_DEBUG_LEVEL肯定会导致灾难:您可能会出现随机崩溃,内存损坏等。不要去那里。在某些情况下,链接器会为您提供链接,但不幸的是,缺乏警告可能仍然会给您带来问题。
唯一真正的解决方法是使用统一的选项进行编译。(当然包括_ITERATOR_DEBUG_LEVEL,但其他设置也可能导致问题。)
问题的根源在于您包含的头文件有#if部分,因此使用不同的设置编译不同的代码。这被称为对ODR的违反,这是唯一定义规则。这将以未定义的行为惩罚您,甚至不需要诊断。
例如,一部分代码可能认为vector的大小为16字节,而其他部分为24字节。一个迭代器的指针在偏移量0处,另一个在偏移量8处。
在mix是绝对必须的地方,你需要小心地防火墙程序的各个部分,这样它们就不会直接共享来自标准库的对象,只由一个轻接口绑定,每个人都只处理它的私有数据。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在linux上调试巨大的C++项目
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在VS调试器中监视映射条目
- 使用调试/崩溃报告将应用程序部署到客户端
- VC++本机单元测试,找不到调试符号
- 如何在C++生成器中禁用"使用调试.dcus"
- 使用vscode调试时,GDB意外退出
- 即使使用调试编译标志,表达式也是"optimized out"
- 调试 CUDA MMU 故障
- 小字符串优化(调试与发布模式)
- 调试和自由执行中的信号处理
- 调试编译的服务器在数据库打开时崩溃
- Visual Studio 调试优化如何工作?
- 如何配置Visual Studio Code以使用cygwin,cmake和gcc进行调试
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何在大型c++项目的可视化代码中设置调试
- Qt 调试显示行号
- 在调试模式下引发C++ "deque iterator not dereferencable"异常