我有一个与C ++动态库有关的问题。通常,C ++动态库由.lib文件和.dll文件组成。如果我理解的话,.lib文件会记录导出函数的位置,而.dll包含实现。我知道发布版本有一些优化,因此发布dll和调试dll应该是不同的。那么发布lib文件和调试lib文件之间的主要区别是什么?有没有办法告诉lib(或dll)文件是发布版本还是调试版本?如果发布版本程序调用调试版本库会发生什么?谢谢!
答案 0 :(得分:7)
请注意,“Release”和“Debug”只是一整套编译器和链接器标志和设置的标签,通常内部的“Release”构建仍会生成调试信息,但会有更高的优化设置。 / p>
因此,除非通过“d”后缀或库的位置明确指示,否则没有标准方法可以判断lib或DLL是“发布”还是“调试”版本。
当“发布”配置可执行文件调用“调试”配置库时会发生什么情况取决于两者之间不同的特定编译和链接器设置。几乎在所有情况下,你都会遇到很多麻烦,有时甚至是非常明显的,有时会更加隐蔽。一些常见的麻烦来源:
两个库都可能使用不同版本的运行时库,并且可能具有某些变量的不同副本,这些变量应该是静态的,并且在可执行文件中的所有库中都是相同的,例如内存分配池及其计数器/哨兵。一个症状是你会得到奇怪的内存分配/释放错误。
库可能在标准库中采用不同的约定,例如安全设置或迭代器调试。这将使“标准”容器的内存布局在库中实际上不同,如果您不幸或不可预测的行为,如果不是,则会导致访问违规。