文章

Mt与md

Mt与md

mt与md格式的区别

mt

mt的dll对于编程格式是更严格的,就比如说mt库是不允许类导出的(这里指的是纯类导出,而非纯虚类)。

此外,Windows系统中能同时加载的mt的dll个数也是有限制的,在Win10的某个系统前,是限制为仅能加载100多个,超出此限制后,若还有其他程序需要加载dll,就会提示加载失败,这也就是PKPM结构软件中1114问题的由来。

md

md的dll则没有上述的限制,但是如要在机器上运行md的dll,则需要安装好vcruntime,软件发行方为了保证自己软件中dll的正确运行,就需要提供自己软件所需版本的vcruntime,这对安装来说无疑是增加了负担。

其他

为了解决360等防护软件对dll的拦截

  • 规范命名临时文件,不随便自己定义临时文件的后缀,而是规范使用约定俗成的后缀,例如二进制就是.dat,配置就是.ini,xml和json等属性文件也规范命名。
  • 史工建议使用nodejs开发 js

来自ChatGPT

在 Visual Studio 项目中,MT(Multi-threaded)和 MD(Multi-threaded DLL)是指不同的运行时库配置选项,它们在链接 C 和 C++ 程序时有以下主要区别:

1. 运行时库类型

  • MT (Multi-threaded):
    • 使用静态链接的多线程运行时库。
    • 所有的运行时库代码都被编译到最终的可执行文件中,不需要依赖于外部的动态链接库(DLL)。
    • 适合于不希望将运行时库的依赖引入到最终可执行文件中的情况,尤其是在分发应用程序时。
  • MD (Multi-threaded DLL):
    • 使用动态链接的多线程运行时库。
    • 运行时库代码被打包在动态链接库中(例如,MSVCR*.dll),在运行时加载。
    • 适合于需要共享运行时库代码的情况,可以减少可执行文件的大小。
    • 需要确保目标机器上安装了相应的 Visual C++ Redistributable。

2. 代码大小和性能

  • MT:
    • 由于所有的运行时代码都被静态链接到可执行文件中,最终生成的可执行文件通常会较大。
    • 静态链接的性能在某些情况下可能更好,因为避免了 DLL 加载的开销。
  • MD:
    • 最终的可执行文件会相对较小,因为运行时库是通过 DLL 提供的。
    • 可能会涉及 DLL 的加载和管理开销。

3. 共享运行时

  • MT:
    • 每个使用 MT 的可执行文件都有自己的运行时库实例,多个应用程序之间不会共享相同的运行时库。
  • MD:
    • 对于使用 MD 的应用程序,多个应用程序可以共享同一个动态链接库实例(例如,多个应用程序都可以使用同一个 MSVCR*.dll)。

4. 适用场景

  • MT:
    • 适合于小型应用程序或者内部工具,不希望依赖外部库。
    • 用于某些嵌入式系统或特定环境下,可能无法使用 DLL。
  • MD:
    • 适合于大型应用程序或需要减少文件大小的场景。
    • 当多个程序需要共享相同的运行时库时,使用 MD 会更有效。

5. 线程安全

  • 两者都支持多线程,并且在设计上都是线程安全的。选择 MT 或 MD 不会影响线程安全性。

6. 错误与不兼容

  • 如果一个项目使用了 MT,而某个依赖库(比如第三方库)使用了 MD,则可能会导致链接错误或运行时错误。在混合使用时需要格外小心。

总结

选择 MT 还是 MD 取决于项目的需求、性能考虑和分发方式。一般来说,如果您希望减小最终可执行文件的大小并允许多个应用程序共享库,使用 MD 更为合适;如果您希望避免依赖于外部 DLL 或者在某些特殊情况下,使用 MT 是更好的选择。在大型项目中,确保所有依赖库使用相同的运行时设置是非常重要的,以避免潜在的链接错误。

参考

微软帮助文档:/MD、/MT、/LD(使用运行时库)

本文由作者按照 CC BY 4.0 进行授权