运行时库(Runtime library)通俗的说就是我们的程序运行的时候所依赖的库文件。在 Windows 平台,这些库由微软提供,并以 2 种形式提供:静态库(lib)
、动态库(lib+dll)
,每个库还分别提供了 Debug 和 Release 两个版本。
一、什么是运行时库
C/C++运行时库从形式上来讲和我们自己开发的静态库、动态库没什么两样,只是它们由微软开发和维护,并提供了一些常用的功能支持(如malloc
, free
, printf
等等),如果我们的程序需要使用这些功能(事实上,只要是 C/C++程序就一定会用到运行时库提供的功能),就要链接 C/C++运行时库。我们可以自主选择是链接“静态库”还是“动态库”,是链接“debug 版本”的还是“release 版本”的。
二、如何链接运行时库
大家可能注意到我们在平时开发中从来没有显式的来链接这些库,这是为什么了?
因为我们的编译器为我们提供了便利,我们只需要向编译器指定特定的编译选项(如MT、MD、MTd、MDd
),编译器就会自动链接对应的库。
同时,编译器会根据MT
和MD
来定义相应的预处理宏: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 | ms = Microsoft |
UCRT
微软开发的通用C语言运行时库,从Visual Studio 2015开始使用 Universal CRT 来取代上面介绍的MSVCRT,简称 UCRT,Windows 8 及以上系统会自带该运行时库。
系统自带的运行时文件位于C:\Windows\System32
和C:\Windows\SysWOW64
目录。
如果安装了Windows SDK,运行时文件还会存在于如下目录:
1 | C:\Program Files (x86)\Windows Kits\10\Redist\XXX.XXX.XXX.XXX\ucrt\DLLs |
MSVCP
微软C++运行时库,以msvcp100d.dll
为例:
1 | ms = Microsoft |
从 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 自动添加了水印。