LNK2038,迭代器不匹配错误,需要忽略

LNK2038, iterator mismatch error, need to ignore

本文关键字:错误 迭代器 不匹配 LNK2038      更新时间:2023-10-16

在尝试将VS2008项目转换为VS2010时,我得到了链接器错误LNK2038。当编译两个不同的项目,其中一个使用_DEBUG预处理器宏,而另一个没有时,会发生此错误。基本上我有一个第三方库,只有release .libs,所以当我在调试模式下构建我的项目时尝试使用该库时,我得到了这个不匹配。

我理解为什么微软给出这个错误(STL迭代器安全),但是我们的项目不使用微软的STL,我们使用STLPort,所以这个错误对我们的项目没有任何意义。我只是需要一种方法来阻止它做这个检查。

在STL包含中有一个名为yvals.h的文件,其中包含用于各种_ITERATOR_DEBUG_LEVEL设置的#pragma detect_mismatch定义。该定义集被包装在#ifndef _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH, #endif中。然而,即使我定义_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH作为我的整个项目的预处理器宏,我仍然得到相同的链接器错误。我甚至可以修改yvals.h来定义这个宏,而它什么也不做(我假设是因为STL本身需要重新编译)。

所以我的问题基本上是,我可以采取什么步骤使_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH实际上按预期工作,以便我的项目在VS2010编译时不会在任何地方进行此检查?

编辑:我知道这是一个迟到的回应,但我刚刚发现这篇文章,意识到我没有发布解决方案。正如其他人提到的,在库中存在不匹配。事实证明VS2010改变了某些项目的默认目录(我在MSDN上发现了一个关于它的帖子),目录的改变导致VS2010在错误的目录中寻找调试库,而不是找到发布库。

必须使用相同版本的标准库,使用相同的选项,如果您希望成功链接。如果使用STLPort,那么你只能链接使用STLPort的库,而不能链接使用vc++标准实现的库。如果混合,要么你链接失败,要么你会得到奇怪的运行时错误。

问题是像std::vector<>::iterator这样的东西可以被定义完全不同;取决于它们在哪里和如何被使用,你会发现自己使用了一个在不同库中构造的实例,使用不同的布局