无法添加定义以提升生成

Unable to add defines to boost build

本文关键字:添加 定义      更新时间:2023-10-16

我正在尝试使用boost构建系统构建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

这让我相信我在助推构建中的"定义"没有任何效果。正确的语法是什么?我找不到任何例子,文件中也没有关于这件事的任何其他内容。

编辑:我想强制要求在我的提升构建中定义_HAS_ITERATOR_DEBUGING=0

正如Igor所评论的,添加define=_ITERATOR_DEBUG_LEVEL=0对我来说很有效。

然后,_HAS_ITERATOR_DEBUGGING由MS标头基于上述设置定义,因此您不应该尝试直接设置它。

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

_ITERATOR_DEBUG_LEVEL不是boost的东西,而是MSVC附带的标准库实现的一部分。您必须非常小心地使用此设置的一致值编译构建中的所有内容。在许多情况下,它是由链接器(如您引用的消息)诊断出的违规行为,不幸的是,它可能未被发现。随着它改变了大多数std集合和相关内容的大小和布局,猜猜接下来会发生什么。

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

关于boost,我不熟悉,但我想你引用的设置会强制宏的值为0。如果是这样,难怪你会有出入。将它设置为2,或者如果你的意思是0,那么继续在你的所有项目中使用它。