了解 /MT 和 /MD 编译器选项的区别和含义

问题描述 投票:0回答:1

在 Visual Studio 中,我可以使用 /MT 或 /MD [MSDN] 编译我的代码。我想我不明白这些选项的所有含义。

我目前的理解是:

  • (A) MSDN 中谈到的“多线程”部分与我的应用程序无关。我的应用程序仍然可以是单线程的。它是具有多线程能力的 C 运行时。我理解为“C 运行时使用
    new
    周围的同步,以保证多个线程在生成指针时不会遇到数据竞争”。过去可能有单线程版本。
  • (B) 虽然这些是编译器选项,但从技术上讲,这更像是链接的东西。
    /MD
    是动态“链接”,
    /MT
    是静态“链接”。
  • (C)
    /MD
    将生成较小的可执行文件,但会加载
    ucrtbase.dll
    ,然后加载 C 运行时 DLL,例如
    VCRUNTIME140.dll
    VCRUNTIME140_1.dll
    MSVCP140.dll
    (或其调试版本)。当我创建安装程序时,我需要这些的可再发行版本。
  • (D)
    /MT
    将产生更大的可执行文件,但直接包含 C 运行时,因此不需要加载额外的 DLL。
  • (E) 如果我有一个大型应用程序(例如 5MLoC,100 个自己的 DLL),选择
    /MD
    是有益的,因为每个单独的 DLL 较小,并且上述 DLL 仅加载到进程中一次。所以基本上,我应该至少用
    /MD
    来编译所有 DLL。
  • (F) C 运行时的调试版本
    /Mxd
    使用不同的内存布局,例如使用 0xCCCCCCCC 作为填充模式来检测缓冲区溢出/欠载。
  • (G) 我无法混合
    /MD
    MT
  • (H)
    /MD
    定义了
    _DLL
    ,程序可以执行各种
    #ifdef _DLL
    魔法,但可能不应该这样做。一个这样的例子是
    errno
    ,它可以是一个简单的 extern int (对于 /MT),也可以是一个函数调用(对于 /MD)。
  • (J) 和
    /MT
    ,每个模块都有自己的 CRT 堆,因此必须在分配的模块中释放内存。 (来源 [MSDN]

以上理解正确吗?我错过了重要的一点吗?

我的目标是理解(J)。我想确保我在去那里的路上理解了该主题的其余部分。

我已读过

c++ visual-studio dll
1个回答
0
投票

/MT 和 /MD 与多线程性质无关,而是与如何提供运行时有关(作为静态链接库或作为 DLL)。

自 Visual Studio 2005 以来,情况一直如此。

/MT 提供了更大的可执行文件,但依赖性有限。 /MD 提供较小的可执行文件,但需要安装 DLL。

使用 /MT 作为安装程序是有意义的。 /MD 可以(取决于 Visual Studio 版本)在发现错误时获得自动升级的 DLL。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.