VC++ 六种 Runtime Library

VC++ 中有六种 Runtime Library 的类型:

类型简称含义对应的库名称备注
Single-Threaded/MLRelease 版的单线程静态库libc.libVS2003 以后被废弃
Single-Threaded Debug/MLdDebug 版的单线程静态库libcd.libVS2003 以后被废弃
Multi-threaded/MTRelease 版的多线程静态库libcmt.lib
Multi-threaded Debug/MTdDebug 版的多线程静态库libcmtd.lib
Multi-threaded DLL/MDRelease 版的多线程动态库msvcrt.lib+msvcrtxx.dll
Multi-threaded DLL DebugMDdDebug 版的多线程动态库msvcrtd.lib+msvcrtxxd.dll

你可以在 VS 的安装目录下找到这些库文件,如我的 VS2010 安装在 C:\Program Files (x86)\Microsoft Visual Studio 10.0,则可以在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\ 和 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\ 中分别找到对应 32 位和 64 位的 libcmt.lib、libcmtd.lib、msvcrt.lib、 msvcrtd.lib 库。libc.lib 和 libcd.lib 由于在 VS2005 就已经废弃了,所以在这肯定找不到。

通过上面的表格你会发现,多线程的动态运行时库是 | msvcrt.lib+msvcrtxx.dll,之所以是 msvcrtxx.dll 是因为每一 个版本的 VS 使用的库名称还不一样。而且还不止包含一个库,除了主要的 MSVCRT 库外,还有 MSVCPRT、MSVCIRT 库。它们之间的对应关系如 下:

导入库MSVCRT.LIBMSVCRTD.LIBMSVCPRT.LIBMSVCPRTD.LIBMSVCIRT.LIBMSVCIRTD.LIB
Visual C++ 5.0MSVCRT.DLLMSVCRTD.DLLMSVCP5.DLLMSVCP5D.DLLMSVCIRT.DLLMSVCIRTD.DLL
Visual C++ 6.0MSVCRT.DLLMSVCRTD.DLLMSVCP6.DLLMSVCP6D.DLLMSVCIRT.DLLMSVCIRTD.DLL
Visual C++ .NET 2002MSVCR70.DLLMSVCR70D.DLLMSVCP70.DLLMSVCP70D.DLL
Visual C++ .NET 2003MSVCR71.DLLMSVCR71D.DLLMSVCP71.DLLMSVCP71D.DLL
Visual C++ 2005MSVCR80.DLLMSVCR80D.DLLMSVCP80.DLLMSVCP80D.DLL
Visual C++ 2008MSVCR90.DLLMSVCR90.DLLMSVCP90.DLLMSVCP90D.DLL
Visual C++ 2010MSVCR100.DLLMSVCR100D.DLLMSVCP100.DLLMSVCP100D.DLL

参考阅读:https://support.microsoft.com/en-us/kb/154753

在你的 VS 安装目录下 (如 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64\Microsoft.VC100.CRT),及系统目录 C:\Windows\System32、C: \Windows\SysWOW64 下都能找到对应的.dll 库。

很多的软件在发布自己的产品时也都会带上这些 DLL (防止用户的操作系统没有安装 VS,或在系统目录下找不到对应的 DLL),如我电脑上的百度影音 安装目录下就有 MSVCR71.DLL (C:\Program Files (x86)\baidu\BaiduPlayer\4.1.2.286\MSVCR71.DLL),WPS 的安装目录下有 msvcr100.dll (C: \Program Files (x86)\WPS Office\9.1.0.5132\wtoolex\msvcr100.dll) 和 msvcp100.dll (C:\Program Files (x86)\WPS Office\9.1.0.5132\wtoolex\msvcp100.dll)

(1). 静态链接的单线程库
静态链接的单线程库只能用于单线程的应用程序, C 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线
程库。
(2). 静态链接的多线程库
静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
该选项生成的可执行文件运行时不需要运行时库 dll 的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某 项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的 “Invalid Address specified to RtlValidateHeap” 问题。
(3). 动态链接的运行时库
动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中, MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态。
链接时将按照传统 VC 链接 dll 的方式将运行时库 MSVCRxx.DLL 的导入库 MSVCRT.lib 链接,在运行时要求安装了相应版本的 VC 运行时库可 再发行组件包(当然把这些运行时库 dll 放在应用程序目录下也是可以的)。 因 / MD 和 / MDd 方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以 MD 方式运作时,其内部会采用同一个堆,内存管理将被 简化,跨模块内存管理问题也能得到缓解。

/MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library (调试版本的运行时刻函数库) ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。

结论:/MD 和 / MDd 将是潮流所趋,/ML 和 / MLd 方式请及时放弃,/MT 和 / MTd 在非必要时最好也不要采用了。

通常可能需要在计算机上安装应用程序,但在安装期间或之前或启动时会触发错误。虽然重新安装软件应该可以解决这个令人不快的问题,但还有其他方法可以解决这个问题。很多 Windows 平台上开发的程序都需要一些系统上的运行库支持才可以正常使用,比如 VC++ 运行库,Java 环境,.Net Freamwork 环境等,如果系统中缺少就会导致系统中的应用程序出现各种问题。 VC++ 运行库集合包 RuntimePack 特别版VC++ 运行库集合包 RuntimePack 特别版 您可以在安装应用程序前从阅读应用程序的要求开始了解软件运行需要那些环境等常见问题。虽然这项工作应该解决这个问题,但是可能需要很长时间才能在线查找所有先决条件,逐个下载并安装它们。 如果您发现错误安装是由于缺少 Microsoft Visual C ++ Redistributable Package 或其他缺少的库或组件,则有两种选择。 首先,您可以在 Microsoft 下载中心中查找 Visual C ++ 运行库,并从那里获取它。不过,您必须确保安装正确的版本,即原始应用程序所需的版本。 其次,您可以选择 RuntimePack,这是一个易于管理的组件套件,包括 2005 至 2019 所有版本的 Microsoft Visual C ++ Redistributable Package,包括 x86 和 x64 架构,以及其他库(DLL 和 OCX 文件) )可能丢失或未注册,从而导致不同的 Windows 错误。 后一个选项可以为您节省大量时间,因为您只需下载单个软件包,而不是单个软件包,并且需要进行一次性确认才能完成。此外,它会自动注册多个系统DLL或OCX文件,这些文件的缺失可能是您遇到的恼人错误的原因。 换句话说,RuntimePack 在 Windows 中添加了额外的运行时库。它包括推荐在 Windows 中安装的大多数库和组件,如果不是全部的话。优点是它的部署时间更短,并且比安装单个组件简单得多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值