2011-09-27 46 views
3

试图将VS2008项目VS2010转换的时候,我发现了链接器错误LNK2038。当编译两个不同的项目时,会出现此错误,其中一个正在使用_DEBUG预处理器宏,另一个不是。基本上我有一个第三方库,只有发布.libs,所以当我尝试在调试模式下构建项目时使用该库时,我得到了这种不匹配。LNK2038,迭代器失配误差,需要忽略

我理解为什么微软给这种错误(STL迭代器的安全),但我们的项目不使用微软的STL,我们打了补丁,所以这个错误意味着什么对我们的项目。我只是需要一种方法来阻止它做这个检查。

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查找调试库的错误目录,并且它是改为找到发布库。

+0

你的项目和第三方库都将链接到同一版本包含标准模板实现的库,所以他们*必须*匹配。尝试混合只会导致很大的痛苦,消除警告只是它的开始。 –

+0

它们确实匹配,它们都使用相同版本的STLPort,这正是我们用于STL实现的原因。在任何情况下,我们都不使用MSFT STL。事实上,我不明白为什么我们的项目是指MSFT STL甚至可以得到这个错误。 –

+0

你说这是第三方库 - 你绝对相信他们也在使用STLPort?你确定谁包括yvals.h? –

回答

1

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

问题是像std::vector<>::iterator这样的东西可能会被完全不同地定义为 ;取决于它们在何处以及如何使用, 将发现自己使用在不同布局的不同库中构建的实例 。

+0

我们在VS2008中使用相同的STLPort作为我们所有的项目,VS2010并没有改变,现在的区别是VS2010在不需要的时候检查迭代器的不匹配。基本上,我们的VS2010项目中的项目代码应该与我们的VS2008项目(包括我们的STL)几乎完全相同,因此此项检查对我们毫无价值。 –

+0

@Nic如果它有效,那纯粹是偶然的。您可以轻松地在用STLPort编译的模块中创建迭代器,并将其用于使用VC++库编译的模块中。形式上,混合两个不同版本的库是未定义的行为,并且在实践中,它通常会带来问题。 –