在 Visual Studio 中,我可以使用 /MT 或 /MD [MSDN] 编译我的代码。我想我不明白这些选项的所有含义。
我目前的理解是:
new
周围的同步,以保证多个线程在生成指针时不会遇到数据竞争”。过去可能有单线程版本。/MD
是动态“链接”,/MT
是静态“链接”。/MD
将生成较小的可执行文件,但会加载 ucrtbase.dll
,然后加载 C 运行时 DLL,例如VCRUNTIME140.dll
、VCRUNTIME140_1.dll
和 MSVCP140.dll
(或其调试版本)。当我创建安装程序时,我需要这些的可再发行版本。/MT
将产生更大的可执行文件,但直接包含 C 运行时,因此不需要加载额外的 DLL。/MD
是有益的,因为每个单独的 DLL 较小,并且上述 DLL 仅加载到进程中一次。所以基本上,我应该至少用 /MD
来编译所有 DLL。/Mxd
使用不同的内存布局,例如使用 0xCCCCCCCC 作为填充模式来检测缓冲区溢出/欠载。/MD
和 MT
。/MD
定义了 _DLL
,程序可以执行各种 #ifdef _DLL
魔法,但可能不应该这样做。一个这样的例子是 errno
,它可以是一个简单的 extern int (对于 /MT),也可以是一个函数调用(对于 /MD)。/MT
,每个模块都有自己的 CRT 堆,因此必须在分配的模块中释放内存。 (来源 [MSDN])以上理解正确吗?我错过了重要的一点吗?
我的目标是理解(J)。我想确保我在去那里的路上理解了该主题的其余部分。
我已读过
/MT 和 /MD 与多线程性质无关,而是与如何提供运行时有关(作为静态链接库或作为 DLL)。
自 Visual Studio 2005 以来,情况一直如此。
/MT 提供了更大的可执行文件,但依赖性有限。 /MD 提供较小的可执行文件,但需要安装 DLL。
使用 /MT 作为安装程序是有意义的。 /MD 可以(取决于 Visual Studio 版本)在发现错误时获得自动升级的 DLL。