无法添加定义以提升构建

Posted

技术标签:

【中文标题】无法添加定义以提升构建【英文标题】: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

【问题讨论】:

尝试指定define=_ITERATOR_DEBUG_LEVEL=0 msdn.microsoft.com/en-us/library/hh697468.aspx 【参考方案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,请继续在所有项目中使用它。

【讨论】:

以上是关于无法添加定义以提升构建的主要内容,如果未能解决你的问题,请参考以下文章

TFS 构建定义 - 添加步骤以运行 DacPac 进行单元测试

在超集中构建自定义马条形图并添加自定义项以自定义图表

javascript 允许在Adblock Plus中将特定频道列入白名单,方法是在URL中添加频道名称,并构建过滤器以添加自定义过滤器

向 Laravel 查询构建器添加自定义函数

Angular 7 - 添加自定义 babel 插件来构建链

graphql-java:如何在以编程方式生成 graphql 模式时添加自定义标量类型?