Visual C ++具有调试和发布以及动态和静态运行时库。静态调试库的用例是什么? AFAIK你不应该分发调试运行时库,并且在你自己的机器上无论如何都可以使用DLL。
答案 0 :(得分:1)
为发布版本选择CRT模型后,您想要调试版本的相同模型,以便最大限度地减少调试和发布行为之间的差异。
如果您为Debug版本使用动态CRT,而为版本构建使用静态CRT,则可能会遇到仅在Release版本中触发的错误,而在Debug版本中不会重现。那非常糟糕。
示例:您在DLL中使用malloc
并使用DLL在EXE中使用free
指针。
调试动态CRT:没问题。
释放静态CRT:发生了奇怪的事情。
如果您使用过Debug static CRT,那么您很快就会看到问题。
编辑:Potential Errors Passing CRT Objects Across DLL Boundaries
CRT库的每个副本都有一个独立且不同的状态。如 这样,CRT对象,如文件句柄,环境变量和 locales仅对这些对象所在的CRT副本有效 分配或设置。
当一个DLL及其用户使用不同的副本时 在CRT库中,您无法跨DLL边界传递这些CRT对象 并期望在另一边正确地拾取它们。也, 因为CRT库的每个副本都有自己的堆管理器, 在一个CRT库中分配内存并将指针传递给一个 由CRT库的不同副本释放的DLL边界是a 堆损坏的潜在原因。
如果你设计你的DLL 跨越边界传递CRT对象或分配内存和期望 它要在DLL外部释放,你限制DLL用户使用 与DLL相同的CRT库副本。 DLL及其用户使用 CRT库的相同副本,只有两者都链接在一起 CRT DLL的版本。 [...]