【发布时间】: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