为了账号安全,请及时绑定邮箱和手机立即绑定

我应该用/ MD或/ MT编译吗?

我应该用/ MD或/ MT编译吗?

C++
青春有我 2019-11-22 16:10:04
在Visual Studio中,有编译标志/ MD和/ MT,可让您选择所需的C运行时库。我了解实现上的区别,但仍不确定要使用哪个。优点/缺点是什么?我听说过/ MD的一个优点是,它允许某人更新运行时(例如修补安全问题),并且我的应用程序将从此更新中受益。尽管对我而言,这似乎是一个非功能:我不希望人们在不让我针对新版本进行测试的情况下更改运行时!我有些好奇的事情:这将如何影响构建时间?(大概/ MT慢一点?)还有哪些其他含义?大多数人使用哪一个?
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

通过与/ MD动态链接,

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

  • 您的可执行文件可以更小(因为它没有嵌入库),并且

  • 我认为,至少DLL的代码段在所有正在使用它的进程之间共享(减少了所消耗的RAM总量)。

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


查看完整回答
反对 回复 2019-11-22
?
隔江千里

TA贡献1906条经验 获得超10个赞

如果使用的是DLL,则应使用动态链接的CRT(/ MD)。

如果为.exe和所有.dll使用动态CRT,则它们将共享一个CRT的单一实现-这意味着它们将共享一个CRT堆,并且可以在一个.exe / .dll中释放分配的内存另一个。

如果您为.exe和所有.dll使用静态CRT,则它们都将获得CRT的单独副本-这意味着它们都将使用自己的CRT堆,因此必须在与之相同的模块中释放内存已分配。您还将遭受代码膨胀(CRT的多个副本)和额外的运行时开销(每个堆从OS分配内存以跟踪其状态的开销,开销是显而易见的)。


查看完整回答
反对 回复 2019-11-22
?
慕村9548890

TA贡献1884条经验 获得超4个赞

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


如果使用/ MT,则可执行文件将不依赖于目标系统上存在的DLL。如果将其包装在安装程序中,则可能不会有问题,您可以选择其中一种。


我自己使用/ MT,因此可以忽略整个DLL混乱。


PS正如Fooz先生所指出的,保持一致至关重要。如果要链接其他库,则需要使用与它们相同的选项。如果您使用的是第三方DLL,那么几乎可以肯定,您将需要使用运行时库的DLL版本。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 730 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信