C++动态发布库和调试库有什么区别?
What's the difference between C++ dynamic Release library and Debug library?
我有一个关于C++动态库的问题。C++动态库通常由一个.lib文件和一个.dll文件组成。如果我理解得很好,.lib文件记录导出函数的位置,而.dll包含实现。我知道发布版本有一些优化,因此发布dll和调试dll应该不同。那么发布库文件和调试库文件之间的主要区别是什么?有没有办法告诉lib(或dll)文件是发布版本还是调试版本?如果发布版本程序调用调试版本库,会发生什么情况?谢谢
请注意,"Release"answers"Debug"只是一整套编译器和链接器标志和设置的标签,内部"Release"构建通常仍会生成调试信息,但会有更高的优化设置。
因此,没有标准的方法来判断lib或DLL是"发布"版本还是"调试"版本,除非它由诸如"d"后缀或库的位置之类的东西明确指示。
当"发布"配置可执行文件调用"调试"配置库时会发生什么,取决于两者之间不同的特定编译和链接器设置。在几乎所有的情况下,你都会遇到很多麻烦,有时非常明显,有时更隐蔽。一些常见的故障来源:
-
这两个库都可能使用不同版本的运行时库,并且可能具有某些变量的不同副本,这些变量本应是静态的,并且在可执行文件中的所有库中都是相同的,例如内存分配池及其计数器/哨兵。一个症状是出现奇怪的内存分配/释放错误。
-
这些库可能在标准库中采用不同的约定,例如安全设置或迭代器调试。这将使"标准"容器的内存布局在不同的库中实际上有所不同,如果幸运的话,你会遇到访问冲突,如果不幸运的话会遇到不可预测的行为。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?