【问题标题】:Mixing /MD and /MT in single dll在单个 dll 中混合 /MD 和 /MT
【发布时间】:2013-06-03 14:50:50
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您似乎已经了解了您看到的问题的原因,如下described on MSDN

    如果确实不可能让所有链接库都使用相同版本的 CRT,那么您唯一可能的选择是避免跨这些模块的边界传递 CRT 对象。您是否可以在您的场景中执行此操作完全取决于您的应用程序。上篇文章的重点是这句话:

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

    我知道您已经说过无法获取或构建兼容的模块以链接到您的应用程序,但我建议您彻底重新审视这一点,并避免不惜一切代价混合不同的 CRT 库。

    【讨论】:

    • 感谢您的回答,我能够更改项目的设计以分离内存分配,以便每个库管理自己的对象。它现在似乎工作了,希望我以后不会遇到问题。
    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多