运行时库(Runtime library)通俗的说就是我们的程序运行的时候所依赖的库文件。在 Windows 平台,这些库由微软提供,并以 2 种形式提供:静态库(lib)动态库(lib+dll),每个库还分别提供了 Debug 和 Release 两个版本。

一、什么是运行时库

C/C++运行时库从形式上来讲和我们自己开发的静态库、动态库没什么两样,只是它们由微软开发和维护,并提供了一些常用的功能支持(如malloc, free, printf等等),如果我们的程序需要使用这些功能(事实上,只要是 C/C++程序就一定会用到运行时库提供的功能),就要链接 C/C++运行时库。我们可以自主选择是链接“静态库”还是“动态库”,是链接“debug 版本”的还是“release 版本”的。

二、如何链接运行时库

大家可能注意到我们在平时开发中从来没有显式的来链接这些库,这是为什么了?
因为我们的编译器为我们提供了便利,我们只需要向编译器指定特定的编译选项(如MT、MD、MTd、MDd),编译器就会自动链接对应的库。

同时,编译器会根据MTMD来定义相应的预处理宏:MT 对应 _MT宏MD对应_MD宏

例如,我们通过Visual Studio开发 C/C++程序时,在工程属性中配置“运行库”为MT、MD、MTd、MDd中的一个:

就相当于间接的向编译器指定编译选项和定义相应的宏。

三、不同版本和形态的运行时库

3.1 运行时库对应的文件

下表列出各种编译选项的含义以及对应的库文件:

类型 全称 含义 对应的库文件 备注
ML Single-Threaded Release 版的单线程静态库 libc.lib 从 VS2005 起被废弃
MLd Single-Threaded Debug Debug 版的单线程静态库 libcd.lib 从 VS2005 起被废弃
MT Multi-threaded Release 版的多线程静态库 libcmt.lib
MTd Multi-threaded Debug Debug 版的多线程静态库 libcmtd.lib
MD Multi-threaded DLL Release 版的多线程动态库 msvcrt.lib + msvcrxxx.dll msvcprt.lib+msvcpxxx.dll
MDd Multi-threaded DLL Debug Debug 版的多线程动态库 msvcrtd.lib + msvcrxxxd.dll msvcprtd.lib + msvcpxxxd.dll

如果计算机上安装了多个版本的 VC++运行环境(或者多个版本的 Visual Studio),则相同名称的 lib 或 dll 就会存在多份。如msvcrt.lib文件:

3.2 运行时库文件命名规则

MSVCRT

微软的C语言运行时库,以msvcr100d.dll为例:

1
2
3
4
5
6
ms = Microsoft
v = Visual
c = C Program
r = Run-time
100 = Version
d = Debug (不带d即为release版本)

UCRT

微软开发的通用C语言运行时库,从Visual Studio 2015开始使用 Universal CRT 来取代上面介绍的MSVCRT,简称 UCRT,Windows 8 及以上系统会自带该运行时库。

系统自带的运行时文件位于C:\Windows\System32C:\Windows\SysWOW64目录。

如果安装了Windows SDK,运行时文件还会存在于如下目录:

1
C:\Program Files (x86)\Windows Kits\10\Redist\XXX.XXX.XXX.XXX\ucrt\DLLs

MSVCP

微软C++运行时库,以msvcp100d.dll为例:

1
2
3
4
5
ms = Microsoft
v = Visual
cp = C Plus Plus 即C++
100 = Version
d = Debug (不带d即为release版本)

从 Visual Studio 2015 开始,版本号固定为140,有如下三个文件:

  • msvcp140.dll
  • msvcp140_1.dll (the memory_resource satellite)
  • msvcp140_2.dll (the special math satellite)

由于微软的 STL 是开源的,因此每个文件提供的具体功能,可以参考 STL 的 CMakeLists.txt

四、运行时库使用注意事项

  • 不要混合使用运行时库的静态库版动态库版
  • 不要混合使用运行时库的debug版release版
  • 不要混合使用 Visual Studio 2013 及更早版本的运行时库,但在 Visual Studio 2015 及更高版本中提供的运行时库可以保证二进制兼容。

参考我的另外一篇文章:MSVC版本的二进制兼容性

五、Visual Studio及MSVC版本

微软从1998年发布Visual C++ 6.0以来,基本上是以每2年一个IDE的速度发布新的开发平台。

Microsoft Visual C++ 编译器版本由四个字段组成:

M - 主版本(两位数)
N - 次要版本(两位数)
B - 内部版本(五位数)
R - 修订版本

Microsoft 特定的编译器宏按以下方式对这些字段进行编码:

_MSC_VER = MMNN
_MSC_FULL_VER = MMNNBBBBB
_MSC_BUILD = R

IDE 发布时间 工具集版本 _MSC_VER宏 MSVC++ 系统支持
Visual C++ 6.0 1998 V60 1200 MSVC++ 6.0 XP+
Visual Studio 2002 2002 V70 1300 MSVC++ 7.0 XP+
Visual Studio 2003 2003 V71 1310 MSVC++ 7.1 XP+
Visual Studio 2005 2005 V80 1400 MSVC++ 8.0 XP+
Visual Studio 2008 2008 V90 1500 MSVC++ 9.0 XP+
Visual Studio 2010 2010 V100 1600 MSVC++ 10.0 XP+
Visual Studio 2012 2012 V110 1700 MSVC++ 11.0 XP+
Visual Studio 2013 2013 V120 1800 MSVC++ 12.0 Win7+
Visual Studio 2015 2015 V140 1900 MSVC++ 14.0 Win7+
Visual Studio 2017 2017 V141 1910 ~ 1916 MSVC++ 14.1 Win7+
Visual Studio 2019 2019 V142 1920 ~ 1929 MSVC++ 14.2 Win7+
Visual Studio 2022 2022 V143 1930 ~ 1940 (可能还会增加) MSVC++ 14.3 Win7+

参考:Microsoft Visual C++ compiler versioning

文章图片带有“CSDN”水印的说明:
由于该文章和图片最初发表在我的CSDN 博客中,因此图片被 CSDN 自动添加了水印。