无法添加定义来提升构建

时间:2013-06-29 14:13:01

标签: c++ boost visual-studio-2012 boost-build

我正在尝试使用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

2 个答案:

答案 0 :(得分:0)

_ITERATOR_DEBUG_LEVEL不是boost的东西,而是MSVC附带的标准库实现的一部分。您必须非常小心地使用此设置的一致值编译构建中的所有内容。在许多情况下,链接器会诊断出违规行为,例如您引用的消息,遗憾的是它可能无法检测到。当它改变大多数标准集合和相关内容的大小和布局时,请猜测后面的内容。

默认情况下,它不会设置为任何内容,当您包含一些标准标头时,它会查找_DEBUG并将自身设置为2.如果系统中没有任何内容设置它并且您始终使用_DEBUG,那么这是很好的方法。

使用提升我不熟悉,但会猜测你引用的设置会强制值为0的宏。如果是这样,难怪你有一个差异。将其设置为2,或者如果您的意思是0,请继续在所有项目中使用它。

答案 1 :(得分:0)

正如Igor评论的那样,添加define=_ITERATOR_DEBUG_LEVEL=0对我有用。

然后根据上述设置由MS-header定义

_HAS_ITERATOR_DEBUGGING,因此您不应尝试直接设置它。

将其设置为0可以在某些情况下(实时3d)显着提高调试性能,因此肯定有使用案例可以说明它,即使重新编译在其接口中公开STL容器/迭代器的所有DLL的痛苦也是如此。