代码之家  ›  专栏  ›  技术社区  ›  andy SKK

我应该用/MD还是/MT编译?

  •  152
  • andy SKK  · 技术社区  · 17 年前

    我理解实现中的差异,但我仍然不确定使用哪一个。优点/缺点是什么?

    我听说/MD的一个优点是,这允许有人更新运行时(比如修补安全问题),我的应用程序将从这次更新中受益。虽然在我看来,这几乎是一个非功能:我不希望人们在不允许我对新版本进行测试的情况下更改我的运行时!

    7 回复  |  直到 17 年前
        1
  •  74
  •   Mr Fooz    17 年前

    通过与/MD动态链接,

    • 您会接触到系统更新(无论是好是坏),

    我还发现,在实践中,当使用使用不同运行时选项构建的静态链接的第三方纯二进制库时,主应用程序中的/MT往往比/MD更容易引起冲突(因为如果C运行时被多次静态链接,特别是如果它们是不同的版本,你会遇到麻烦)。

        2
  •  29
  •   JoeG    13 年前

    如果你为.exe和所有.dll使用静态CRT,那么它们都会得到一个单独的CRT副本,这意味着它们都会使用自己的CRT堆,因此必须在分配内存的同一模块中释放内存。您还将遭受代码膨胀(CRT的多个副本)和过度的运行时开销(每个堆从操作系统分配内存以跟踪其状态,开销可能很明显)。

        3
  •  17
  •   Community Mohan Dere    9 年前

    我认为通过Visual Studio构建的项目的默认值是/MD。

    我自己使用/MT,这样我就可以忽略整个DLL混乱。

    P.S.As Mr. Fooz 指出,保持一致性至关重要。如果你与其他库链接,你需要使用它们所做的相同选项。如果你使用的是第三方DLL,几乎可以肯定你需要使用运行库的DLL版本。

        4
  •  13
  •   Adrian Grigore    17 年前

        5
  •  8
  •   i_am_jorf    17 年前

        6
  •  7
  •   lothar    17 年前

    http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :

    /MT定义_MT,以便从标准头文件(.h)中选择特定于多线程的运行时例程版本。此选项还导致编译器将库名称LIBCMT.lib放入.obj文件中,以便链接器将使用LIBCMT.leb解析外部符号。创建多线程程序需要/MT或/MD(或其调试等效项/MTd或/MDd)。

    使用此选项编译的应用程序静态链接到MSVCRT.lib。此库提供了一层代码,允许链接器解析外部引用。实际工作代码包含在MSVCR71.DLL中,该DLL必须在运行时可用于与MSVCRT.lib链接的应用程序。

    当/MD与定义的_STATIC_CPPLIB(/D_STATIC_CPPLB)一起使用时,它将导致应用程序链接到静态多线程标准C++库(libcpmt.lib),而不是动态版本(msvcprt.lib),同时仍然通过msvcrt.lib动态链接到主CRT。

    所以,如果我正确地解释了它,那么 /MT /MD 动态链接。

        7
  •  1
  •   zar    11 年前

    如果您正在构建使用其他dll或库的可执行文件,那么/MD选项是首选,因为这样所有组件都将共享同一个库。当然,此选项应适用于所有涉及的模块,即dll/lib.exe。

    如果你的可执行文件不使用任何库或dll,那么任何人都可以调用它。现在差异不大,因为共享方面没有发挥作用。

    因此,也许你可以用/MT启动应用程序,因为没有其他令人信服的理由,但当需要添加库或dll时,你可以用lib/dll将其更改为/MD,这很容易。