我正在尝试使用boost buildystem构建boost序列化/文件系统/系统的调试版本。这是我使用的:
b2 serialization filesystem system variant=debug link=static threading=multi
runtimelink=static define=_HAS_ITERATOR_DEBUGGING=0 toolset=msvc-11.0
然而,当我在我的调试visual studio项目中包含库时,我仍然会遇到这样的错误:
(basic_iarchive.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in Game.obj
这让我相信我在boost版本中的'define'没有任何影响。什么是正确的语法?我找不到任何例子,文档dosnt就此事说了其他任何事情。
编辑:我想强制我想在我的boost版本中定义_HAS_ITERATOR_DEBUGGING = 0
答案 0 :(得分:0)
_ITERATOR_DEBUG_LEVEL
不是boost的东西,而是MSVC附带的标准库实现的一部分。您必须非常小心地使用此设置的一致值编译构建中的所有内容。在许多情况下,链接器会诊断出违规行为,例如您引用的消息,遗憾的是它可能无法检测到。当它改变大多数标准集合和相关内容的大小和布局时,请猜测后面的内容。
默认情况下,它不会设置为任何内容,当您包含一些标准标头时,它会查找_DEBUG并将自身设置为2.如果系统中没有任何内容设置它并且您始终使用_DEBUG,那么这是很好的方法。
使用提升我不熟悉,但会猜测你引用的设置会强制值为0的宏。如果是这样,难怪你有一个差异。将其设置为2,或者如果您的意思是0,请继续在所有项目中使用它。
答案 1 :(得分:0)
正如Igor评论的那样,添加define=_ITERATOR_DEBUG_LEVEL=0
对我有用。
_HAS_ITERATOR_DEBUGGING
,因此您不应尝试直接设置它。
将其设置为0可以在某些情况下(实时3d)显着提高调试性能,因此肯定有使用案例可以说明它,即使重新编译在其接口中公开STL容器/迭代器的所有DLL的痛苦也是如此。