使用VS2010构建,我正在构建一个导致许多链接错误的库:
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2'
导致我必须同时发布我的lib的发行版和调试版。 我没有理由发布lib的调试版本,它只是膨胀二进制发行版。但是内置调试的客户端代码拒绝链接到我的发布库。
我之前看到过这个问题,但他们似乎并未提出正确的问题。 我理解这个错误是什么,为什么我得到它(好吧,有点;我不确定是什么发出依赖。你呢?),但我想知道的是如何消除这种依赖性的发生在我的lib?
类似于在使用冲突的CRT时抱怨的libs,可以用/ Zl(从目标文件中省略默认库名)来防止,当然有办法防止这种依赖也被发送到我的libs中吗?
我只想生成一个优化的lib,它能够链接调试或发布代码。客户端代码调试lib并不重要。几乎没有第三方库提供不同的调试和发布版本。供应商如何避免这个问题呢?
是否有人确切知道导致此链接依赖性的原因,以及如何完全禁用它,或将其从我的代码中分解出来?
答案 0 :(得分:9)
您正在使用调试构建设置编译的一些代码与使用发布构建设置编译的其他代码启用的迭代器调试相关联。
此链接错误会阻止您像这样甩掉腿。好吧,右手的双腿,左臂和食指,你必须用下巴操作鼠标。例如,从具有不同布局的std :: string对象获得的运行时错误很难诊断。堆腐败是一个令人讨厌的问题,关于最糟糕的调试。您必须使用相同的设置重新编译代码,而不是其他方式。
答案 1 :(得分:1)
同样的问题,但我正在编写回归测试和脚本命令行编译和链接。在进行调试构建时,我只是在编译行上忘记了/ D_DEBUG。
答案 2 :(得分:0)
我在尝试编译我在别处找到的一组boost代码时发现的一件事是内部已经定义了_SECURE_SCL = 1和_HAS_ITERATOR_DEBUGGING = 1。我的构建是调试,它通常会将迭代器级别设置为2,但这包括我得到的代码将其覆盖为0! (直到深入研究它我才注意到它)它与调试增强库相连接,调试增强库是在迭代器级别设置为2时默认构建的。因此,会发生不匹配。如果您尝试使用2015年之前生成的升级库来构建VS 2015+,也会发生这种不匹配。但这不太可能。
答案 3 :(得分:-1)
在编译中涉及的lib文件中将0替换为2。
答案 4 :(得分:-1)
您可以尝试在项目的调试配置设置中将_ITERATOR_DEBUG_LEVEL定义为0或...
要指定_ITERATOR_DEBUG_LEVEL宏的值,请使用/ D. 编译器选项在命令行上定义它,或使用#define 在源代码中包含C ++标准库头文件之前 文件。例如,在命令行中,编译sample.cpp 调试模式并使用debug iterator支持,可以指定 _ITERATOR_DEBUG_LEVEL宏定义:
cl /EHsc /Zi /MDd /D_ITERATOR_DEBUG_LEVEL=0 sample.cpp
在源文件中,在任何标准库之前指定宏 用于定义迭代器的标头。
C ++
// sample.cpp
#define _ITERATOR_DEBUG_LEVEL 0
#include <vector>
// ...