
原帖地址:
现在重新整理在博客上,以方便保存。
本人从2002年开始订阅《程序员》,惊闻以后不会有纸质版,甚为惋惜。希望《程序员》杂志以后能坚持走下去。
其实the Universal CRT(通用C运行时库)已经不能算是“下一代”,因为它已经在前两年伴随着Visual Studio 2015和Windows10发布。但是由于之前使用VS2015开发的应用还较少,关注的人也少,相关的文章更少。所以笔者想干脆用一篇文章,深入浅出的介绍一下Universal CRT
CRT,也就是“C Runtime”,中文译为:C运行时。我们一直称为C Runtime Library(C运行时库)。它主要负责实现C程序在运行时的各种抽象功能实现。应用软件发生异常不同的C编译器会有不同的具体实现程序,比如Windows下常见的微软的VC编译器的msvcrt.dll;GCC/Glibc的crt0.o、crti.o等。具体到二进制表现形式,可以是动态库,也可以是静态库。
CRT一般会至少负责以下功能:
实现C库函数。比如:printf、fopen等
初始化程序启动所需要的一些功能
异常处理
多线程处理
CRT也可以看成是一个操作系统抽象层。大家都知道,每一种操作系统都有自己的API或者是系统调用。像C语言之所以能够跨平台(代码级),就是因为我只需要用C库函数写程序,CRT会转化为相应平台的具体实现的API来处理。
下面我们要着重讨论的是Windows下的开发工具Visual C++配套的CRT,以下将统称为“VC运行时库”。
阶段 特性版本 特点
(注:上表中的划代是作者自己的划代方式)
我记得我最早学C语言还是上大二(2002年)的时候,那时可是VC的黄金年代。额~~应该说是年代。大家都在学习VC++6.0,一个堪称经典的版本。VC++6.0是为了配合Windows98的应用软件开发而发布的,发布的年代也差不多就是98年前后,所以内部有些文件又称之为VC98。
到这个时候,VC运行时库文件只有一个叫msvcrt.dll的,一般在c:\windows\system32下,大家发行软件产品的时候,基本上不需要考虑是否需要带个什么库,因为默认操作系统都会自带的。
逐渐的,大家发现一个非常棘手的问题,那就是随着功能的增多,不同版本的msvcrt.dll支持的功能和函数不同,版本的识别和兼容成了难题。当时很多安装包为了自己的需要,会不停的覆盖系统的msvcrt.dll,导致运行不稳定。如果把WinXP系统的msvcrt.dll覆盖了Win98的,那会导致WinXP不稳定。所以后来就发展除了第二代的CRT。
自从微软发布Visual Studio.Net 2002/2003开始,为了解决日益增长的功能和DLL版本兼容性问题,微软给现有的运行时库加上了版本号,并且把运行时库拆分为多个文件,比较常见的是msvcrXXX.dll和msvcpXXX.dll。其中XXX是版本号。

版本号的定义和文件命名如下表所示:
Visual Studio版本 VC运行时库版本 用于dll命名的编号
其中msvcrXXX.dll(注意不是msvcrtXXX.dll)一般负责实现C语言的基础特性,如程序启动、异常处理、库函数等功能。msvcpXXX.dll负责标准C++库的相关实现。大家可以看看其中的导出函数就能明白。
在这一阶段中,开发者想要发布软件产品,就必须确保目标计算机上必须已经安装了相应版本的运行时库。一般情况下,微软推荐大家使用运行时库安装包来进行安装。对于大型软件为了预防万一,都会附带vcredist.exe安装包。但是这种方法很不受待见。因为现在大多数软件都是通过互联网进行分发,对安装包大小很敏感。每次打包附带一个运行时库包,既增加了用户的下载时间,又增加了推广成本。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-68942-1.html
可口可乐需要创新什么东东呀
你真的是不要脸