VC++中有六种Runtime Library的类型:
类型 | 简称 | 含义 | 对应的库名称 | 备注 |
---|---|---|---|---|
Single-Threaded | /ML | Release版的单线程静态库 | libc.lib | VS2003以后被废弃 |
Single-Threaded Debug | /MLd | Debug版的单线程静态库 | libcd.lib | VS2003以后被废弃 |
Multi-threaded | /MT | Release版的多线程静态库 | libcmt.lib | |
Multi-threaded Debug | /MTd | Debug版的多线程静态库 | libcmtd.lib | |
Multi-threaded DLL | /MD | Release版的多线程动态库 | msvcrt.lib+msvcrtxx.dll | |
Multi-threaded DLL Debug | MDd | Debug版的多线程动态库 | 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.LIB | MSVCRTD.LIB | MSVCPRT.LIB | MSVCPRTD.LIB | MSVCIRT.LIB | MSVCIRTD.LIB |
---|---|---|---|---|---|---|
Visual C++ 5.0 | MSVCRT.DLL | MSVCRTD.DLL | MSVCP5.DLL | MSVCP5D.DLL | MSVCIRT.DLL | MSVCIRTD.DLL |
Visual C++ 6.0 | MSVCRT.DLL | MSVCRTD.DLL | MSVCP6.DLL | MSVCP6D.DLL | MSVCIRT.DLL | MSVCIRTD.DLL |
Visual C++ .NET 2002 | MSVCR70.DLL | MSVCR70D.DLL | MSVCP70.DLL | MSVCP70D.DLL | ||
Visual C++ .NET 2003 | MSVCR71.DLL | MSVCR71D.DLL | MSVCP71.DLL | MSVCP71D.DLL | ||
Visual C++ 2005 | MSVCR80.DLL | MSVCR80D.DLL | MSVCP80.DLL | MSVCP80D.DLL | ||
Visual C++ 2008 | MSVCR90.DLL | MSVCR90.DLL | MSVCP90.DLL | MSVCP90D.DLL | ||
Visual C++ 2010 | MSVCR100.DLL | MSVCR100D.DLL | MSVCP100.DLL | MSVCP100D.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在非必要时最好也不要采用了。