C++动态发布库和调试库有什么区别?

What's the difference between C++ dynamic Release library and Debug library?

本文关键字:什么 区别 调试 动态 布库 C++      更新时间:2023-10-16

我有一个关于C++动态库的问题。C++动态库通常由一个.lib文件和一个.dll文件组成。如果我理解得很好,.lib文件记录导出函数的位置,而.dll包含实现。我知道发布版本有一些优化,因此发布dll和调试dll应该不同。那么发布库文件和调试库文件之间的主要区别是什么?有没有办法告诉lib(或dll)文件是发布版本还是调试版本?如果发布版本程序调用调试版本库,会发生什么情况?谢谢

请注意,"Release"answers"Debug"只是一整套编译器和链接器标志和设置的标签,内部"Release"构建通常仍会生成调试信息,但会有更高的优化设置。

因此,没有标准的方法来判断lib或DLL是"发布"版本还是"调试"版本,除非它由诸如"d"后缀或库的位置之类的东西明确指示。

当"发布"配置可执行文件调用"调试"配置库时会发生什么,取决于两者之间不同的特定编译和链接器设置。在几乎所有的情况下,你都会遇到很多麻烦,有时非常明显,有时更隐蔽。一些常见的故障来源:

  • 这两个库都可能使用不同版本的运行时库,并且可能具有某些变量的不同副本,这些变量本应是静态的,并且在可执行文件中的所有库中都是相同的,例如内存分配池及其计数器/哨兵。一个症状是出现奇怪的内存分配/释放错误。

  • 这些库可能在标准库中采用不同的约定,例如安全设置或迭代器调试。这将使"标准"容器的内存布局在不同的库中实际上有所不同,如果幸运的话,你会遇到访问冲突,如果不幸运的话会遇到不可预测的行为。