【问题标题】:C++ Linking release built library with my debug buildC++ 将发布构建的库与我的调试构建链接
【发布时间】:2011-04-24 17:06:12
【问题描述】:

我已经下载了第 3 方库,并在“发布”模式下构建了 .lib 文件。 将库添加到我的项目后,如果我在发布模式下运行我的项目,那很好。但是如果我在调试模式下运行我的项目,我会得到一个错误:

_iterator_debug_level value '0' doesn't match value '2;

我可以在调试模式下重建库,但我认为我不需要调试库本身?而且我已经下载了预建的 3rd 方库,之前只有一个发布版本(我假设?)无论我的项目是处于调试还是发布状态,链接都很好。我想知道这是怎么做到的。

【问题讨论】:

  • 一切都可以靠运气!我会在调试模式下构建库,使用与您的项目相同的设置,并完成它。

标签: c++


【解决方案1】:

如果您想分发其他人可以在发布或调试模式下使用的发布库,您需要做两件事:

  • 构建一个 DLL,以便您获得自己的 C 运行时库副本
  • 不跨库边界共享 CRT 资源,例如堆。 C 代码最大的问题是动态分配的内存必须在边界的同一侧释放。对于 C++ 代码,您可以在 DLL 中使用 std 命名空间,但不能跨边界传递这些对象。

这就是预先构建的第三方库最有可能完成的工作。仅当外部接口不共享 CRT 对象时,您才能对您的库执行相同的操作。或者,您可以将单独的发布和调试版本构建为静态库。

【讨论】:

  • Ben,你能再解释一下你的答案吗?这是否意味着如果我的库(预建版本)通过引用接受对象,比如 std::string,那么其他人无法将我的库链接到他们的调试版本?
  • @Sachin:我的意思是我已经写过的内容:“对于 C++ 代码,您可以在 DLL 中使用 std 命名空间,但不能跨边界传递这些对象”这包括按引用传递和指针和复制(按值传递)。
  • 这个限制是因为微软为了增强调试版本中的 STL 调试而实施的调试机制 (_ITERATOR_DEBUG_LEVEL)?
  • @SachinJoseph:这是库在调试和发布之间不同的方式之一,但不是唯一的方式。调试模式下的内存分配器存储额外的信息,例如调用分配函数的位置。而且可能还有其他事情。
【解决方案2】:

看起来您的调试二进制文件和您下载的库使用了不兼容的迭代器调试模式。迭代器调试通常由宏控制。根据宏值,插入器和许多其他对象的大小可以改变。您很幸运,您的程序发出了有用的错误消息,而不是简单地崩溃。

检查库文档并确保您的项目使用相同的迭代器调试模式。您也可以尝试在发布模式下重新编译库。如果这没有帮助,您将不得不在调试模式下重新编译库,即使您不打算调试库本身。

【讨论】:

  • 谢谢。所以这个问题与发布构建库与调试构建项目链接无关。我不知道这个迭代器调试是关于什么的,而且我似乎找不到在 VS2010 中更改迭代器调试模式的方法。但是我做了一些搜索,发现如果我将#define _HAS_ITERATOR_DEBUGGING 0 放在我的代码中,那么它就可以工作。我可以使用发布库在调试中运行我的项目。虽然我不太明白发生了什么。
  • @terryhau _HAS_ITERATOR_DEBUGGING 宏控制可视化编译器放置的许多框架,以帮助您调试迭代器。在级别 2 中,它提供了迭代器越界访问检查,以及许多非常简洁的调试内容。如果您想了解更多详情,请查看channel9
  • @Razispio 谢谢。我去看看。我只是想知道,既然我在发布模式下编译了库,不应该禁用或删除所有迭代器调试的东西吗?
  • @terryhau。在包含来自 STL 的任何内容之前,必须在每个实现文件(.cpp 或 .cc 文件)中设置 _HAS_ITERATOR_DEBUGGING。最安全的方法是将 D_HAS_ITERATOR_DEBUGGING=0 添加到编译器命令行选项。右键单击您的项目,然后单击属性--> C++ --> 命令行选项(或类似的东西,记不清了)。
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 2010-10-15
  • 1970-01-01
  • 2011-11-12
  • 2014-03-05
  • 1970-01-01
  • 2010-10-19
  • 2018-02-04
相关资源
最近更新 更多