【问题标题】:Unable to add defines to boost build无法添加定义以提升构建
【发布时间】:2013-06-29 14:13:00
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2013-01-10
      • 2023-03-08
      • 2016-07-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多