3

我正在尝试使用 boost buildsystem 构建 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 构建中定义 _HAS_ITERATOR_DEBUGGING=0

4

2 回答 2

2

define=_ITERATOR_DEBUG_LEVEL=0正如 Igor 评论的那样,为我添加作品。

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

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

于 2016-09-14T06:33:22.980 回答
0

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

默认情况下它没有设置任何东西,当你包含一些标准头文件时,它会寻找_DEBUG并将自己设置为2。如果系统中没有任何东西设置它并且你一直使用_DEBUG,这是个好方法。

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

于 2013-06-29T14:57:20.287 回答