C和C++运行库

一、Windows下动态库

1. 静态函数库

这类库的名字一般是libxxx.lib;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

2. 动态函数库

这类库的名字一般是libxxx.lib + libxxx.dll;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

二C、C++运行库

为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C库函数。C标准仅仅定义了函数原型,并没有提供实现。因此这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run Time Libray) ,简称CRT。对于VC++编译器来说,它提供的CRT库支持C标准定义的标准C函数,同时也有一些专门针对windows系统特别设计的函数。

与C语言类似,C++也定义了自己的标准,同时提供相关支持库,我们把它称为C++运行时库或C++标准库。

由于C++对C的兼容性,C++标准库包括了C标准库,除此之外还包括IO流和标准模板库STL。

VC++完美的支持C和C++标准,因此也就按照C和C++的标准定义的函数原型实现了上述运行时库。为了方便有不同需求的客户的使用,VC++分别实现了动态链接库DLL版本和静态库LIB版本。同时为了支持程序调试且不影响程序的性能,又分别提供了对应的调试版本。调试版本的名称在Release版本名称后添了字母d。

对于C运行时库CRT,VC6.0、VC2005、VC2008和VC2010均提供了DLL版本和LIB版本。上述各个编译器提供的LIB版的CRT库,均实现在libcmt.lib。对应的调试版名称为libcmtd.lib。

而DLL版本名称根据编译器不同而不同,我们可以从名称上加以分辨。

VC6.使用的CRT库的DLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.DLL。

VC2005使用的CRT库的DLL版本在MSVCR80.DLL中实现,对应调试版本为MSVCR80.DLL。

VC2008使用的CRT库的DLL版本在MSVCR90.DLL中实现,对应调试版本为MSVCR90D.DLL。

VC2010使用的CRT库的DLL版本在MSVCR100.DLL中实现,对应调试版本为MSVCR100D.DLL。

C++标准兼容C标准,但VC各版本将C++编译器使用的C标准库与C编译器使用的C运行库一起实现,它们使用相同的运行库。

对于C++标准库中的IO流和STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。
LIB版均实现在libcpmt.lib中,对应的调试版本为libcpmtd.lib。

不同版本的编译器实现的DLL也不相同。
VC6.使用的C++类库的 DLL版本在MSVCP60.DLL中实现, 对应调试版本为MSVCP60D.DLL。

VC2005使用的C++类库的DLL版本在MSVCP80.DLL中实现,对应调试版本为MSVCP80.DLL。

VC2008使用的C++类库的 DLL版本在MSVCP90.DLL中实现,对应调试版本为MSVCP90D.DLL。

VC2010使用的C++类库的DLL版本在MSVCP100.DLL中实现,对应调试版本为MSVCP100D.DLL。

在各个版本的编译器中,我们可以通过配置选项来设置程序使用的C和C++运行时库的类型。如下图(其他版本编译器大同小异):

MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库集成到程序中成为程序中的代码,程序体积会变大。

MTd选项:LIB的调试版。

MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行。

MDd选项:表示使用DLL的调试版。

3、优缺点

静态版必须把C和C++运行库复制到目标程序中,所以产生的可执行文件会比较大。同时对于使用多个模块的大型软件来说,如果每个模块均选择静态链接C、C++运行库,在程序运行时就会存在多个运行库。在链接时会出现重复定义的问题。

使用DLL版的C和C++运行库,程序在运行时动态的加载对应的DLL。程序体积变小,但一个很大的问题就是一旦找不到对应DLL,程序将无法运行。假设使用VC6.0并选择使用MD选项构建,那么当用户使用VC2005来使用这个DLL时很可能出现找不到MSVCRT.DLL或MSVCP60.DLL的情况。

原文地址:https://www.cnblogs.com/alvin2010/p/8531367.html

时间: 2024-10-22 16:02:23

C和C++运行库的相关文章

Linux误删C基本运行库libc.so.6急救方法

首先普及一下关于libc.so.6的基本常识: libc.so.6是glibc的软链接 ll  /lib64/libc.so.6lrwxrwxrwx 1 root root 11 Aug 27 2014 /lib64/libc.so.6 -> libc-2.5.so glibc是gnu发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc,所以说绝大部分操作命令都缺少不了它 如何误删了/lib64/libc.so.6,大部分系统命令将无法

Go 1.7.1 版本发布,修复编译器和运行库

在发布了1.7正式版的20多天后,Go 1.7.1版本发布了. 该版本修复了编译器,运行库,文档,以及compress/flate,hash/crc32, io net, net/http, path/filepath, reflect, 和系统调用包. 更多细节见 Go 1.7.1 发布说明:https://github.com/golang/go/issues?q=milestone%3AGo1.7.1

请自行检查是否安装VC9运行库??

phpStudy是一款PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的PHP调试环境. 1.程序自带FTP服务器,支持多用户,无需再安装FTP服务器.自带网站挂马监视器,随时记录文件的修改情况,让挂马文件无处可逃. 2.启动失败,原因一是防火墙拦截,二是80端口已经被别的程序占用,如IIS,迅雷等:三是没有安装VC9运行库,php和apache都是VC9编译.解决以上

CRT:C运行库简介

1)运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的"小内核"语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等):所以,C 语言内核开发出来之后,Dennis Ritchie 和 Brian Kernighan 就用 C 本身重写了 90% 以上的 UNIX 系统函数,并且把其中最常用的部分独立出来,形成头文件和对应的 LIBRARY,C run-

c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

视频运行库AVICAP32.DLL说明收藏

视频运行库AVICAP32.DLL说明收藏2008-09-28 09:04 // ------------------------------------------------------------------// 窗口消息 WM_CAP... 哪个是送到 AVICAP 窗口// ------------------------------------------------------------------ // 开始定义消息参数 整数型const avicap32='avicap32.

C# 公共语言运行库

.Net Framework的核心是其运行库执行环境,称为公共语言运行库(CLR)或.NET运行库.通常将在CLR控制下的代码称为托管代码. 在.Net中,编译分为两个阶段: (1)把源代码编译为Microsoft中间语言(IL). (2)CLR把IL编译为平台专用的代码.C# 公共语言运行库,布布扣,bubuko.com

运行库glibc

 运行时库(Runtime Library),可能某些和我一样的初学者不是很了解这个概念,但是运行时库有着十分重要的作用. 作为一个C语言开发者,你是否想过,我们经常所使用的printf,memset等函数,其功能是谁帮我们实现的?又是如何做到可以在不同平台上兼容的? 这一切都是运行时库的默默支持. 任何一个C程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能正常运行.这套代码至少包含入口函数,及其所依赖的函数所构成的合集. 当然,它还理应包括各种标准库函数的实现.这样一个代码集合称之为

ImageMagickObject.MagickImage.1 '80041771' - 安装vc2008运行库

今天重装了系统后,发现 ImageMagick 不能正常的使用了: ImageMagickObject.MagickImage.1  '80041771' convert: 455: unable to load module `C:\ImageMagick\modules\coders\IM_MOD_RL_PNG_.dll' ... 经过在网上两个小时左右的搜索,终于找到解决方案: 安装VC运行库:Visual C++ 2008 Redistributable Package 就能正常使用 I

MinGW 创建的程序或 DLL 脱离 libgcc-xx-xx.dll 和 libstdc++-x.dll 运行库的方法

MinGW 沿袭了 Linux 下 gcc/g++ 的习惯,编译出的程序或者动态链接库(共享库)总是默认采用动态链接方式,需要系统中附带运行时库文件 libgcc-xx-xx.dll 和 libstdc++-xx.dll.那么如果我们不想发布程序时还要附带这两个运行库,该如何操作呢?通过参考 gcc/g++ 用户手册,发现只需要在编译器或链接器参数设置中使用 -static-libgcc 和 -static-libstdc++ 即可实现对这两个运行库的静态库链接,不必附带运行库了.如果采用参数