第二篇 使用各类C Run-time library运行时库
来源:互联网 发布:广联达计价软件使用 编辑:程序博客网 时间:2024/06/03 12:10
一 概论
C运行时库最早的版本出现于70年代,这个时候的应用程序都是单线程,所以运行时库也是单线程的。但是这样的运行时库不能满足现在的需求。现在的C运行时库有多个全局变量,例如errno和静态变量,这可能在多线程程序中引起冲突。例如 两个线程都设置了errno变量,后设置的将会覆盖现设置的,使得用户得不到正确错误信息;另外一个例子是假如有两个module同时静态连接了运行时库,则在内存中会有两套运行时库,有两套全局变量,这样会造成一个module对全局变量的设置值不能被另一个module读取。
为了解决多线程的问题,首先vc++提供了两种版本的C运行时库,一个用于单线程,一个用于多线程。多线程库对单线程库的主要区别就是:1 类似errno的全局变量,每个线程单独设置一个; 2 多线程库中的数据结构一同步机制加以保护。
另外,VC++提供的多线程运行时库又分为静态连接库和动态连接库两类,而每类运行时库又分为debug版和release版。这样,VC++就提供了一共6个 C运行时库:
LIBC.LIB: Single thread static link LIBCD.LIB: Debug single thread static link
LIBCMT.LIB: MultiThread static link LIBCMTD.LIB: Debug multiThread static link
MSVERT.LIB: MultiThread dynamic link MSVERTD.LIB: Debug muitiThread dynamic link
二 各类C运行时库的区别及使用方法
1 LIBC.LIB :静态连接的单线程库,只能用于单线程的应用程序。C运行时库的目标代码最终被编译在应用程序的二进制代码中。
编译选项 : /ML
2 LIBCMT.LIB:静态连接的多线程库,最终目标代码被编译在应用程序的二进制文件中,但是可以在多线程程序中使用。
编译选项: /MT
3 MSVERT.LIB:动态连接的多线程版,将所有的C库函数保存在一个单独的动态连接库MSVCRTxx.DLL中。
编译选项: /MD
如果是使用debug runtime library ,则编译选项分别为 /MLd, /MTd, /MDd。 调试版本的运行时库包含了调试信息,并采用了一些保护机制帮助发现错误,加强了对错误的检测,因此运行性能较慢。
三 一个典型的错误例子
注意在MFC的CFile的输入输出,已经包含了多线程代码。所以使用CFile时必须使用多线程库。如果选择了单线程选项,则会出现错误信息:" Please use the /MD switch for _AFXDLL builds" 这个错误输出在AFXVER_.h中以预编译指令定义。
以下是例子代码:
#include <stdio.h>#include <afx.h>int main(){CFile file;CString str("abc") ;TRY{file.Open("file.dat", CFile::modeWrite | CFile::modeCreate );}CATCH (CFileException, e){# ifdef _DEBUGafxDump <<"file opening failed" <<e->m_cause<<"/n" ;# endif}END _CATCHfile.Write(str, str,GetLength()) ;file.Close() ;}
代码vc6 xp2下通过测试
- 第二篇 使用各类C Run-time library运行时库
- 理解C run-time library (C运行时库)
- 如何理解C run-time library(C运行时库)
- C run-time library (C运行时库)说明
- C run-time library (C运行时库)说明
- C运行时库详解(C Run-Time Library)
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- 如何理解C run-time library(C运行时库)
- C运行时库(C Run-time Library)详解
- C运行时库(C Run-time Library)详解
- synchronized多线程同步
- Introduction to Ext (EXT 介绍入门)
- Linux 账号与身份管理
- 快结束了,又开始了...
- DOM
- 第二篇 使用各类C Run-time library运行时库
- Playing With Ext The Easy Way (玩EXT简单方法)--firebug下调试ext
- 为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧
- Javascript的调试利器:Firebug使用详解
- 第三篇 使用自己的函数替换C run-time启动函数
- 关于windows xp sp2/sp3 中tcpip.sys对于Raw socket的限制
- 序列化
- Tips Struts2 部署在生产环境中需要注意的参数
- C++类功能扩展预留五招