4

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

4

1 回答 1

7

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

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

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

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

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

于 2012-09-12T13:26:30.493 回答