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

时间:2013-06-02 19:21:00

标签: visual-c++ visual-studio-2012 static-libraries

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

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

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

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

1 个答案:

答案 0 :(得分:5)

您似乎已经了解了所遇到问题的原因,并且described on MSDN如下

MSDN screenshot

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

  

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

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