怎么做引流网站,做网站为什么要用源码,制作什么网站好,唐山市网站建设转自#xff1a;http://blog.csdn.net/ithzhang/article/details/20160009 你所不知道的C和C运行库 周五晚#xff0c;小雨#xff0c;少见的未加班。无聊#xff0c;遂准备写一篇博客#xff0c;介绍一下C和C运行库#xff0c;只因发现工作几年的人对此一知半解的… 转自http://blog.csdn.net/ithzhang/article/details/20160009 你所不知道的C和C运行库 周五晚小雨少见的未加班。无聊遂准备写一篇博客介绍一下C和C运行库只因发现工作几年的人对此一知半解的大有人在。 在使用VC构建项目时经常会遇到下面的链接错误 初学者面对这些错误常常不知所错libcmt.lib是什么东西msvcrtd.dll又是干吗用的在使用VC时我们也常常对下面的运行库配置项感到疑惑它们到底究竟是什么意思呢甚至一些工作了很多年的程序员也对此一知半解。今天让我们来了解一下它们。从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运行库VC完美的支持C和C标准因此也就按照C和C的标准定义的函数原型实现了上述运行时库。为了方便有不同需求的客户的使用VC分别实现了动态链接库DLL版本和静态库LIB版本。同时为了支持程序调试且不影响程序的性能又分别提供了对应的调试版本。调试版本的名称在Release版本名称后添了字母d。对于C运行时库CRTVC6.0、VC2005、VC2008和VC2010均提供了DLL版本和LIB版本。上述各个编译器提供的LIB版的CRT库均实现在libcmt.lib。对应的调试版名称为libcmtd.lib。而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。C标准兼容C标准但VC各版本将C编译器使用的C标准库与C编译器使用的C运行库一起实现它们使用相同的运行库。对于C标准库中的IO流和STLVC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。LIB版均实现在libcpmt.lib中对应的调试版本为libcpmtd.lib。不同版本的编译器实现的DLL也不相同。VC6.使用的C类库的 DLL版本在MSVCP60.DLL中实现 对应调试版本为MSVCP60D.LIB。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的调试版。在
《由使用LeakDialog时遇到的问题而引出的一些分析》
这篇文章中的实验一使用VC6.0的默认配置没有拦截到内存泄露。其原因是VC6.0的控制台项目默认配置是静态链接CRT库单线程版后面会介绍。动态版DLL和静态版LIBC和C运行库的优缺点因为静态版必须把C和C运行库复制到目标程序中所以产生的可执行文件会比较大。同时对于使用多个模块的大型软件来说如果每个模块均选择静态链接C或C运行库在程序运行时就会存在多个运行库。在链接时也会出现重复定义的问题如文章首第一张图所示。使用DLL版的C和C运行库程序在运行时动态的加载对应的DLL。程序体积变小但一个很大的问题就是一旦找不到对应DLL,程序将无法运行。假设使用VC6.0并选择使用MD选项构建那么当用户使用VC2005来使用这个DLL时很可能出现找不到MSVCRT.DLL或MSVCP60.DLL的情况。在这里介绍一个很好的工具Dependency Walker可以用来分析DLL的依赖关系同时查看DLL导出的函数使用方法请Google。使用该工具打开MSVCRT.DLL如下图我们可以在其中找到我们经常使用使用的C函数如printf ,getchar,malloc等。打开MSVCP100.DLL也可以找到这些C函数在开发的过程中我们也会遇到如下图的链接错误LIBCD.lib究竟是何方神圣呢它其实是LIBC.lib的调试版而LIBC.lib是只有在VC6.0才会使用的静态库该库是CRT的单线程版用于支持单线程版本的CRT。VC2005等更高版本的编译器已经不再提供单线程版本转而使用多线程版的MSVCR80.DLL或libcmt.lib。当遇到上述符号定义冲突的链接错误时可以选择忽略libcd.lib。