"_ITERATOR_DEBUG_LEVEL"存在不匹配:值“0”与值“2”不匹配。

12

我正在使用VS2010进行构建,构建一个导致许多链接错误的库:

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2'

导致我不得不同时发布库的发布版本和调试版本的情况出现了。 我没有理由发布库的调试版本,这只会使二进制分发变得臃肿。但是在调试模式下构建的客户端代码拒绝链接我的发布库。
我曾经看到过这个问题,但他们似乎没有问对问题。 我知道为什么会出现这个错误(嗯,有点;我不确定是什么精确地发出了依赖项。你知道吗?),但我想知道的是如何消除这个依赖项在我的库中发生的问题?
类似于当使用冲突的CRT时会抱怨库的情况,可以通过/Zl(从对象文件中省略默认库名称)来防止,那么肯定也有一种方法可以防止将此依赖项发射到我的库中,对吗?
我只想生成一个能够链接调试或发布代码的单个优化库。客户端代码调试库并不重要。几乎没有第三方库会提供不同的调试和发布版本。供应商是如何避免这个问题的呢?
有人知道是什么精确地导致了这个链接依赖关系,以及我如何完全禁用它或将其从我的代码中分离出来吗?

你解决了吗?我不认为下面的答案是答案。如果你正在生成一个LIB,为什么它会在第一次链接时链接呢?如果你生成一个DLL以及一个关联的导入LIB,那么无论人们是调试还是发布,他们都可以使用它。 - eric frazer
是的,我误解了问题。这只是微软疯狂CRT情况的进一步扩展。 STL具有模板结构,其布局会根据编译代码时_ITERATOR_DEBUG_LEVEL宏的状态而更改。如果您包含任何STL头文件,则您的代码将硬编码为_ITERATOR_DEBUG_LEVEL特定状态,并且它根本无法与以不同方式构建的代码交互。这不是关于调试/发布,而是关于嵌入在编译代码中的不同结构布局。 此外,MS dbg/release C++库是针对其中一种状态构建的。 - Manu Evans
基本上,如果您在代码中包含任何STL标头,则意味着您承诺使用每个结构布局构建一套库。 如果您不想发布调试/未优化的代码,可以手动定义_ITERATOR_DEBUG_LEVEL为每个值并执行两次release构建,然后适当地将它们命名为debug/release。尽管它们都是“release”构建,但必须区分以匹配客户端链接应用程序的STL数据结构。 - Manu Evans
简而言之:除了“在代码中不包含任何STL头文件”之外,没有其他“解决方法”。 - Manu Evans
4个回答

11

您正在链接一些使用启用了迭代器调试的调试构建设置编译的代码与其他使用发布构建设置编译的代码。

这个链接错误可以防止您像那样炸掉双腿、左臂和右手食指,您将不得不用下巴操作鼠标。例如,由于std::string对象具有不同的布局而导致的运行时错误非常难以诊断。堆损坏是一个很棘手的问题,也是最难调试的问题。没有其他方法,您必须使用相同的设置重新编译代码。


1
我理解这个问题,但它并没有回答我的问题。有没有办法阻止编译器生成针对每个配置不同的代码?大多数库都没有发布调试和发布版本对。你是说无法将发布库链接到调试应用程序吗?那不可能是正确的,我经常这样做。 - Manu Evans
3
是的,没有回答问题。我也在寻找解决方案。不确定为什么它获得了2个赞。 - Robinson
“没有别的办法”似乎是一个奇怪而神秘的短语。我很少使用如此明确的措辞。答案是显而易见的,它不能令你满意并不是我的错。去抱怨微软吧。 - Hans Passant

1

我遇到了同样的问题,但我正在编写回归测试和脚本命令行编译和链接。当进行调试构建时,我只是忘记在编译行上加上 /D_DEBUG。


0

在尝试编译一组我从其他地方找到的boost代码时,我发现其中内部定义了_SECURE_SCL=1和_HAS_ITERATOR_DEBUGGING=1。我的构建是调试版本,通常会将迭代器级别设置为2,但这个代码覆盖了它并将其设置为0!(直到我深入挖掘才注意到)它链接到调试boost库,该库默认使用迭代器级别设置为2进行构建。因此,出现了不匹配。如果您尝试使用VS 2015+与在2015年之前生成的boost库进行构建,也可能会出现此类不匹配。但这种情况不太可能发生。


-1

在编译涉及的库文件中将0替换为2。


作为全局宏定义或者什么? - Manu Evans
1
我使用十六进制编辑器进行了操作。但是正如其他人所说,出现的问题是某个库是使用一些过时的设置编译的,其中该参数(你从来没有使用过)现在被设置为0,而最新的MSVC编译器设置为2。老实说,应该做的是使用最新的编译器设置重新编译所有源代码。 - Boris Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接