C++ C++;将版本生成库与我的调试生成链接

C++ C++;将版本生成库与我的调试生成链接,c++,C++,我下载了一个第三方库,并以“release”模式构建了.lib文件。 在将lib添加到项目中之后,如果我在发布模式下运行项目,就可以了。但如果在调试模式下运行项目,则会出现错误: _iterator_debug_level value '0' doesn't match value '2; 我可以在调试模式下重建库,但我不认为我需要调试库本身?我已经下载了预构建的第三方库,在此之前,它只附带一个发布版本(我想是吧?),无论我的项目是在调试阶段还是在发布阶段,链接都很好。我想知道这是怎么做到的。

我下载了一个第三方库,并以“release”模式构建了.lib文件。 在将lib添加到项目中之后,如果我在发布模式下运行项目,就可以了。但如果在调试模式下运行项目,则会出现错误:

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

我可以在调试模式下重建库,但我不认为我需要调试库本身?我已经下载了预构建的第三方库,在此之前,它只附带一个发布版本(我想是吧?),无论我的项目是在调试阶段还是在发布阶段,链接都很好。我想知道这是怎么做到的。

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

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

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

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


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

谢谢。因此,问题与发布构建库与调试构建项目的链接无关。我不知道这个迭代器调试是关于什么的,而且我似乎找不到一种方法来更改VS2010中的迭代器调试模式。然而,我做了一些搜索,发现如果我在代码中加入#define(定义)和(迭代器)调试0,那么它就可以工作了。我可以使用发布库在调试中运行我的项目。尽管我真的不明白发生了什么。@terryhau有迭代器调试宏控制许多框架,可视化编译器可以帮助您调试迭代器。对于级别2,它提供了迭代器越界访问检查,以及许多非常简洁的调试内容。如果您想了解更多详细信息,请查看。@Razispio谢谢。我来看看。我只是想知道,既然我在发布模式下编译了这个库,那么所有迭代器调试的东西不应该被禁用或删除吗?@terryhau_在包含STL中的任何内容之前,必须在每个实现文件(.cpp或.cc文件)中设置HAS_ITERATOR_调试。最安全的方法是将D_HAS_ITERATOR_debugation=0添加到编译器命令行选项中。右键单击项目,点击属性-> C++ >命令行选项(或类似的内容,无法准确地回忆)。我会在调试模式下构建库,使用与项目相同的设置,然后完成。Ben,你能再解释一下你的答案吗?这是否意味着如果我的库(预构建在发布中)接受对象,比如说STD::string,那么其他人就不能把我的库链接到它们的调试构建?@ SaCin:我的意思是:“对于C++代码,可以在DLL中使用<代码> STD < /Cord>命名空间,但是不跨越边界传递那些对象”这包括按引用和指针传递以及复制(按值传递)。这是因为Microsoft在调试构建中实现了调试机制(_迭代器_debug_级别)来增强STL的调试吗?@SachinJoseph:这是库在调试和发布之间的不同方式之一,但这不是唯一的方式。调试模式下的内存分配器存储额外信息,例如调用分配函数的位置。可能还有其他事情。