在单个dll中混合/ MD和/ MT

Fir*_*tul 5 static-libraries visual-c++ visual-studio-2012

我在Visual Studio 2012中有dll项目,它是用/ MT(静态多线程运行时库)编译的.它还链接第三方静态库,也用/ MT(库A)编译,到目前为止没问题.

问题来自于另一个静态库(库B),它不幸地用/ MD编译.在我的dll中,我需要链接两者,除了它们之外别无选择(我不能用不同的选项重新编译它们).我能够成功地将所有内容链接在一起,但现在我遇到内存分配和删除问题 - 有时它无法删除已分配的对象,有时会发生另一个奇怪的错误.我相信它是由混合内存管理函数引起的,我的dll的不同部分使用 - 当调用new时,对象在库B中创建,但是当调用delete时,它尝试使用不同的函数集释放内存 - 但是我可能是错的.

所以我的问题是,这真的是由混合内存管理功能引起的吗?如果是这样,有没有办法让这项工作在一起?

我想到的唯一解决方案是将库B包装在用/ MD编译的另一个dll中,然后从原始dll使用它以确保将使用不同的内存管理功能.我不确定,如果这会有所帮助,我想避免它.

Rog*_*and 5

您似乎已经了解了您遇到的问题的原因,并在MSDN上对其进行了如下所述

MSDN截图

如果真的不可能让所有链接库使用相同版本的CRT,那么唯一可能的选择是避免将CRT对象传递到这些模块的边界.是否可以根据您的应用程序执行此操作.上述文章的关键点是这句话:

如果您设计DLL以使其跨越边界传递CRT对象或分配内存并期望将其释放到DLL之外,则限制DLL用户使用与DLL相同的CRT库副本.仅当两者都与相同版本的CRT DLL链接时,DLL及其用户才使用相同的CRT库副本.

我知道您已经声明无法获取或构建兼容模块以链接到您的应用程序,但我建议您详尽地重新考虑这一点,并避免不惜一切代价混合使用不同的CRT库.