VisualC中的C运行时库浅析

上传人:宝路 文档编号:22053344 上传时间:2017-11-25 格式:DOC 页数:6 大小:45.64KB
返回 下载 相关 举报
VisualC中的C运行时库浅析_第1页
第1页 / 共6页
VisualC中的C运行时库浅析_第2页
第2页 / 共6页
VisualC中的C运行时库浅析_第3页
第3页 / 共6页
VisualC中的C运行时库浅析_第4页
第4页 / 共6页
VisualC中的C运行时库浅析_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《VisualC中的C运行时库浅析》由会员分享,可在线阅读,更多相关《VisualC中的C运行时库浅析(6页珍藏版)》请在金锄头文库上搜索。

1、Run-Time Library 是编译器提供的标准库,提供一些基本的库函数和系统调用。我们一般使用的 Run-Time Library 是 C Run-Time Libraries,当然也有 Standard C+ libraries。 C Run-Time Libraries 实现 ANSI C 的标准库。VC 安装目录的 CRT 目录有 C Run-Time库的大部分源代码。 C Run-Time Libraries 有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。 动态链接库版本:/MD Multithreaded DLL 使用导入库 MSVCRT

2、.LIB/MDd Debug Multithreaded DLL 使用导入库 MSVCRTD.LIB 静态库版本:/ML Single-Threaded 使用静态库 LIBC.LIB/MLd Debug Single-Threaded 使用静态库 LIBCD.LIB/MT Multithreaded 使用静态库 LIBCMT.LIB/MTd Debug Multithreaded 使用静态库 LIBCMTD.LIB若要使用此运行时库请忽略这些库 单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 多线程

3、(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 使用 DLL 的多线程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 调试多线程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 使用 DLL 的

4、调试多线程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib 【转】Visual C+中的 C 运行时库浅析1.概论运行时库是程序在运行时所需 要的库文件,通常运行时库是以 LIB 或 DLL 形式提供的。C运行时库诞生于 20 世纪 70 年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多 线程机制在此时还属于新观念。所以这个时期的 C 运行时库都是单线程的。随着操作系统多线程技术的发展,最初的 C 运行时库无法满足程序的需求,出现了严重的问题。C 运行时库使 用了多个全局变量(例如 errno)

5、和静态变量,这可能在多线程程序中引起冲突。假设两个线程都同时设置 errno,其结果是后设置的 errno 会将先前 的覆盖,用户得不到正确的错误信息。因此,Visual C+提供了两种版本的 C 运行时库。一个版本供单线程应用程序调用,另一个版本供多线程应用程序调用。多线程运行时库与单线程运行时库有两个重大差别:(1)类似 errno 的全局变量,每个线程单独设置一个;这样从每个线程中可以获取正确的错误信息。(2)多 线程库中的数据结构以同步机制加以保护。这样可以避免访问时候的冲突。Visual C+提供的多线程运行时库又分为静态链接库和动态链接库两类,而每一类运行时库又可再分为 debug

6、 版和 release 版,因此 Visual C+共提供了 6 个运行时库。如下表:C 运行时库 库文件Single thread(static link) libc.libDebug single thread(static link) libcd.libMultiThread(static link) libcmt.libDebug multiThread(static link) libcmtd.libMultiThread(dynamic link) msvert.libDebug multiThread(dynamic link) msvertd.lib2.C 运行时库的作用C 运

7、行时库除了给我们提供必要的库函数调用(如 memcpy、printf、malloc 等)之外,它提供的另一个最重要的功能是为应用程序添加启动函 数。C 运行时库启动函数的主要功能为进行程序的初始化,对全局变量进行赋初值,加载用户程序的入口函数。不采用 宽字符集的控制台程序的入口点为 mainCRTStartup(void)。下面我们以该函数为例来分析运行时库究竟为我们添加了怎样的入口程序。这个函 数在 crt0.c 中被定义,下列的代码经过了笔者的整理和简化:void mainCRTStartup(void)int mainret;/*获得 WIN32 完整的版本信 息*/_osver = G

8、etVersion();_winminor = (_osver 8) & 0x00FF ;_winmajor = _osver & 0x00FF ;_winver = (_winmajor 16) & 0x00FFFF ;_ioinit(); /* initialize lowio */* 获得命令行信息 */_acmdln = (char *) GetCommandLineA();/* 获得环境信息 */_aenvptr = (char *) _crtGetEnvironmentStringsA();_setargv(); /* 设置命令行参数 */_setenvp(); /* 设置环境参数

9、 */_cinit(); /* C 数据初始化:全局变量初始化,就在这里!*/_initenv = _environ;mainret = main( _argc, _argv, _environ ); /*调用 main 函数*/exit( mainret );从以上代码可知,运行库在调用用户程序的 main 或 WinMain 函数之前,进行了一些初始化工作。初始化完成后,接着才调用了我们编写的 main 或 WinMain 函数。只有这样,我们的 C 语言运行时库和 应用程序才能正常地工作起来。 除了 crt0.c 外,C 运行时库中还包含 wcrt0.c、 wincrt0.c、wwinc

10、rt0.c 三个文件用来提供初始化函数。wcrt0.c 是 crt0.c 的宽字符集版,wincrt0.c 中包含 windows 应用程序的入口函数,而wwincrt0.c 则是 wincrt0.c 的宽字符集版。Visual C+的运行时库源代码缺省情况下不被安装。如果您想查看其源代码,则需要重装Visual C+,并在重装在时选中安装运行库源代码选项。3.各种 C 运行时库的区别(1)静态 链接的单线程库静态链接的单线程库只能用于单线程的应用程序,C 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过/ML 编译选项可以设置 Visual C+使用静态链接的单线程库。(2)静态链

11、接的多线程库静态链接的多线程库的 目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过/MD 编译选项可以设置 Visual C+使用静态链接的单线程库。(3)动态链接的运行时库动态链接的运行时库将所有的 C 库函数保存在一个单独的 动态链接库 MSVCRTxx.DLL 中,MSVCRTxx.DLL 处理了多线程问题。使用/MD 编译选项可以设置 Visual C+使用动态链接的运行时库。/MDd、 /MLd 或 /MTd 选项使用 Debug runtime library(调试版本的运行时刻函数库) ,与/MD、 /ML 或 /MT 分别对应。 Debug 版本

12、的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。程序运行时,很大一部分时间是在这些运行库里运行。在程序(Release 版)被编译时,VC 会根据编译选项(单线程、多线程或 DLL) 自动将相应的运行时库文件(libc.lib、libcmt.lib 或Import library msvcrt.lib)链接进来。注:修改编译选项,将/MD 或/MDd 改为/MT 或/MTd,就实现了对 VC 运行时库的静态链接,在运行时就不再需要 VC 的 dll 了。五、附:下面是 MSDN 关于 V

13、isual C+编译器选项的说明:这些选项选择单线程或多线程运行时 例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。/MD使应用程序使用运行时库 的多线程并特定于 DLL 的版本。定义_MT 和_DLL,并使编译器将库名 MSVCRT.lib 放入.obj 文件中。用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际 工作代码包含在 MSVCR80.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。当在定义了_STATIC_CPPLIB(/D_STATIC_CPPLIB)的情况下使用/MD 时,

14、它将 导致应用程序与静态多线程标准 C+库(libcpmt.lib)而非动态版本(msvcprt.lib)链接,同时仍通过 msvcrt.lib 动态链接 到主 CRT。/MDd定义_DEBUG、_MT 和_DLL,并使应用程序使用运行时库的调试多线 程并特定于 DLL 的版本。它还使编译器将库名 MSVCRTD.lib 放入.obj 文件中。/ML使编译器将库名 LIBC.lib 放入.obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。 LIBC.lib 不提供多线程支持。/MLd定义_DEBUG 并使编译器将库名 LIBCD.lib 放入.obj 文件中

15、,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。/MT使应用程序使用运行时库的多线程静态版本。定义_MT 并使编译器将库名 LIBCMT.lib 放入.obj文 件中,以便链接器使用 LIBCMT.lib 解析外部符号。/MTd定义_DEBUG 和_MT。此选项 还使编译器将库名 LIBCMTD.lib 放入.obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。/LD创建 DLL。将/DLL 选项传递到链接器。链接 器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 Dl

16、lMain 函数。链接 DLL 启动代码。如果命令行上未指定导出(.exp)文件,则创建导入库(.lib);将导入库链接到调用您的 DLL 的应用程序。将/Fe(命名 EXE 文件)解释为命名 DLL 而不是.exe 文件;默认程 序名成为 basename.dll 而不是 basename.exe。除非显式指定/MD,否则将暗指/MT。/LDd创建调试 DLL。定义_MT 和 _DEBUG。警告不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副 本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在.exe 文件内部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个 (或更多)副本。例如,当与用动态(DLL)版本的运行时库链接的.exe 文件一起使用时,用静态(非 DLL)版本的运行时库链接的动态链接库可能导致问 题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。注:/ML、/MLd 貌似已经不提供; 另,LIBC.LIB,L

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号