C运行时库(C run-time library)概述

一、什么是C运行时库(C run-time library)

 CRT,也就是“C Runtime”,中文译为:C运行时。我们一直称为C Runtime Library(C运行时库)。取这个名字就是因为你的 C 程序运行时需要这些库中的函数.。它主要负责实现C程序在运行时的各种抽象功能实现。不同的C编译器会有不同的具体实现程序,比如Windows下常见的微软的VC编译器的msvcrt.dll;GCC/Glibc的crt0.o、crti.o等。具体到二进制表现形式,可以是动态库,也可以是静态库。

  1. 产生过程
    C 语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);所以,C 语言内核开发出来之后,Dennis Ritchie 和 Brian Kernighan 就用 C 本身重写了 90% 以上的 UNIX 系统函数,并且把其中最常用的部分独立出来,形成头文件和对应的 LIBRARY,C run-time library 就是这样形成的。
    随后,随着 C 语言的流行,各个 C 编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应的 Standard Library,但大部分实现都是与各个平台有关的。由于各个 C 编译器对 C 的支持和理解有很多分歧和微妙的差别,所以就有了 ANSI C;ANSI C (主观意图上)详细的规定了 C 语言各个要素的具体含义和编译器实现要求,引进了新的函数声明方式,同时订立了 Standard Library 的标准形式。所以C运行时库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方 C 运行库(Third party C run-time libraries)。

  2. 包含内容
    C run-time library里面含有初始化代码、C库函数(比如:printf、fopen等)、异常处理码(例如divide by zero处理)、多线程处理等内容,你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time library包含了C程序运行的最基本和最常用的函数。

  3. CRT的跨平台
    CRT也可以看成是一个操作系统抽象层。大家都知道,每一种操作系统都有自己的API或者是系统调用。像C语言之所以能够跨平台(代码级),就是因为我只需要用C库函数写程序,CRT会转化为相应平台的具体实现的API来处理。
    在这里插入图片描述

  4. C++的Standard C++ Library
    到了 C++ 世界里,有另外一个概念:Standard C++ Library,它包括了上面所说的 C run-time library 和 STL。包含 C run-time library 的原因很明显,C++ 是 C 的超集,没有理由再重新来一个 C++ run-time library. VC针对C++ 加入的Standard C++ Library主要包括:LIBCP.LIB, LIBCPMT.LIB和 MSVCPRT.LIB

二、VC++提供的CRT版本

VC++完美的支持C和C++标准,因此也就按照C和C++标准定义的函数原型实现了上述运行时库。为了方便有不同需求的客户使用,VC++分别实现了动态链接库DLL版本和静态链接库LIB版本。同时为了支持程序调试且不影响程序的性能,又分别提供了对应的调试版本。调试版本的名称在Release版本名称后添加了字母d。
在这里插入图片描述
MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库集成到程序中成为程序中的代码,程序体积会变大。
MTd选项:LIB的调试版。
MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行。
MDd选项:表示使用DLL的调试版。

三、不同版本CRT对应的库文件

  1. 静态版本
    对于C运行时库CRT,VC6.0、VC2005、VC2008和VC2010均提供了静态链接版本和动态链接版本。
    对于静态链接版本,上述各个编译器均实现在libcmt.lib,对应的调试版名称为libcmtd.lib。例如在VS2017中,CRT的静态链接库文件位置如下所述;另外,C++的标准库文件名称libcpmt.lib,对应调试版的标准库文件名称为libcpmtd.lib。
    在这里插入图片描述
  2. 动态版本
    对于动态链接版本,其CRT导入库文件名称为msvcrt.lib,对应调试版为msvcrtd.lib;C++标准库文件的导入库名称为msvcprt.lib,对应调试版为msvcprtd.lib.在VS2017下,动态链接库的导入库位置如下图所示。
    在这里插入图片描述
    动态库的dll文件在各个版本编译器中的名称为:
    VC6.使用的CRT库的DLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.LIB。
    VC2005使用的CRT库的DLL版本在MSVCR80.DLL中实现,对应调试版本为MSVCR80.DLL。
    VC2008使用的CRT库的DLL版本在MSVCR90.DLL中实现,对应调试版本为MSVCR90D.DLL。
    VC2010使用的CRT库的DLL版本在MSVCR100.DLL中实现,对应调试版本为MSVCR100D.DLL。
    VC2013使用的CRT库的DLL版本在MSVCR120.DLL中实现,对应调试版本为MSVCR120D.DLL。

四、动态版(dll)和静态版(lib)C和C++运行库的优缺点

因为静态版必须把C和C++运行库复制到目标程序中(.exe),所以产生的可执行文件会比较大。同时对于使用多个模块的大型软件来说,如果每个模块均选择静态链接C或C++运行库,在程序运行时就会存在多个运行库。在链接时也会出现重复定义的问题,如图所示。
在这里插入图片描述
使用DLL版的C和C++运行库,程序在运行时动态的加载对应的DLL。程序体积变小,但一个很大的问题就是一旦找不到对应DLL,程序将无法运行(比如所要移植的电脑没有安装VC++)。假设使用VC6.0并选择使用MD选项构建,那么当用户使用VC2005来使用这个DLL时很可能出现找不到MSVCRT.DLL或MSVCP60.DLL的情况。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Santiago

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值