【问题标题】:LNK2038, iterator mismatch error, need to ignoreLNK2038,迭代器不匹配错误,需要忽略
【发布时间】:2011-11-26 05:20:51
【问题描述】:

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

我理解微软为什么给出这个错误(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 在错误的目录中查找调试库,并且它是而是找到发布库。

【问题讨论】:

  • 您的项目和第 3 方库都将链接到包含标准模板实现的相同版本的库,因此它们必须匹配。尝试混合只会带来很多痛苦,消除警告只是开始。
  • 它们确实匹配,它们都使用相同版本的 STLPort,这是我们用于 STL 实现的版本。在任何情况下,我们都不使用 MSFT STL。事实上,我不明白为什么我们的项目引用 MSFT STL 甚至得到这个错误。
  • 你说这是一个第三方库——你确定他们也在使用 STLPort?你确定谁包括 yvals.h?
  • 这个第 3 方库是纯 C 语言,没有使用 STL。我还没有确定谁在使用 yvals.h,但我感觉我遇到了一个依赖问题,这超出了这个线程/问题的范围。
  • 可能对某人有所帮助的说明:我遇到了相同的链接器错误,并将 _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH 定义为预处理器定义 DID 为我解决了这个问题。我试图手动设置 _ITERATOR_DEBUG_LEVEL 并且这完全崩溃了,但是允许不匹配纯粹而简单地修复它。由于这是一个链接器错误,因此似乎无法忽略它。希望这对某人有帮助!

标签: c++ visual-studio-2010 visual-studio-2008 linker iterator


【解决方案1】:

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

问题是像std::vector<>::iterator 这样的东西可能会被定义 完全不同;根据它们的使用地点和方式,您 会发现自己使用的是在不同库中构建的实例, 布局不同。

【讨论】:

  • 我们在所有项目中都使用与在 VS2008 中使用的相同的 STLPort,VS2010 并没有改变这一点,现在的区别是 VS2010 正在检查迭代器不匹配时不需要。基本上我们的VS2010项目的代码应该和我们的VS2008项目的代码几乎相同,包括我们的STL,所以这个检查对我们来说毫无价值。
  • @Nic 如果成功了,那纯属偶然。您可以轻松地在使用 STLPort 编译的模块中创建迭代器,并在使用 VC++ 库编译的模块中使用它。形式上,混合两个不同版本的库是未定义的行为,而在实践中,它经常会出现问题。
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2017-07-25
  • 2018-04-19
  • 2014-12-06
  • 1970-01-01
  • 2021-12-23
  • 2018-05-05
相关资源
最近更新 更多