Chinaunix首页 | 论坛 | 博客
  • 博客访问: 365485
  • 博文数量: 242
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1134
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-20 10:53
文章分类

全部博文(242)

文章存档

2015年(1)

2014年(10)

2013年(18)

2012年(213)

分类:

2012-11-09 16:52:59

原文地址:C运行库 作者:tuyer

   现在可供选择的C运行库有glibc, uClibc以及newlib等。glibc是由GNU项目提供的标准C运行库,它针对PC应用设计,较庞大,但能提供最优的兼容性。如果一般的嵌入式开发可选用uClibc。uClibc原本是uCLinux开发过程中的一个C语言库,现已经独立于uCLinux项目并且进一步完善。它对glibc的大部分函数进行了重写,并且目标就定位于嵌入式,所以其相对glibc而言要小巧很多。此外由于它的函数与glibc保持一致,这样很多原本基于glibc开发的软件基本无需改动便可改用uClibc编译运行,使得在嵌入式系统上占用的内存和磁盘空间更少。但由于毕竟不是标准的C运行库,因此uClibc拥有着一定的兼容性问题。 
   Newlib是一个面向嵌入式系统的C运行库.最初是由Solutions收集组装的一个源代码集合,取 
名为newlib,现在由Red Hat维护,目前的最新的版本是1.11.01'1.
对于与GNU兼容的嵌入式C运行库,Newlib并不是唯一的选择,但是从成熟度来讲,newlib是最优秀
的.newlib具有独特的体系结构,使得它能够非常好地满足深度嵌入式系统的要求.newlib可移植性强,
具有可重入特性,功能完备等特点,已广泛应用于各种嵌入式系统中.
 
1)运行时库就是   C   run-time   library,是   C   而非   C++   语言世界的概念:取这个名字就是因为你的   C   程序运行时需要这些库中的函数.  
   
  2)C   语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);所以,C   语言内核开发出来之后,Dennis   Ritchie   和   Brian   Kernighan   就用   C   本身重写了   90%   以上的   UNIX   系统函数,并且把其中最常用的部分独立出来,形成头文件和对应的   LIBRARY,C   run-time   library   就是这样形成的。  
   
  3)随后,随着   C   语言的流行,各个   C   编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应的   Standard   Library,但大部分实现都是与各个平台有关的。由于各个   C   编译器对   C   的支持和理解有很多分歧和微妙的差别,所以就有了   ANSI   C;ANSI   C   (主观意图上)详细的规定了   C   语言各个要素的具体含义和编译器实现要求,引进了新的函数声明方式,同时订立了   Standard   Library   的标准形式。所以C运行时库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方   C   运行库(Third   party   C   run-time   libraries)。  
   
  4)C   run-time   library里面含有初始化代码,还有错误处理代码(例如divide   by   zero处理)。你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C   run-time库,main()就不会被调用,exit()也不能被响应。因为C   run-time   library包含了C程序运行的最基本和最常用的函数。  
   
   
  5)到了   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  
   
  6)Windows环境下,VC提供的   C   run-time   library又分为动态运行时库和静态运行时库。  
  动态运行时库主要是DLL库文件msvcrt.dll(or   MSVCRTD.DLL   for   debug   build),对应的Import   library文件是MSVCRT.LIB(MSVCRTD.LIB   for   debug   build)  
  静态运行时库(release版)对应的主要文件是:  
  LIBC.LIB   (Single   thread   static   library,   retail   version)  
  LIBCMT.LIB   (Multithread   static   library,   retail   version)  
   
  msvcrt.dll提供几千个C函数,即使是像printf这么低级的函数都在msvcrt.dll里。其实你的程序运行时,很大一部分时间时在这些运行库里运行。在你的程序(release版)被编译时,VC会根据你的编译选项(单线程、多线程或DLL)自动将相应的运行时库文件(libc.lib,libcmt.lib或Import   library   msvcrt.lib)链接进来。  
   
  编译时到底哪个C   run-time   library联入你的程序取决于编译选项:  
  /MD,   /ML,   /MT,   /LD       (Use   Run-Time   Library)  
  你可以VC中通过以下方法设置选择哪个C   run-time   library联入你的程序:  
  To   find   these   options   in   the   development   environment,   click   Settings   on   the   Project   menu.   Then   click   the   C/C++   tab,   and   click   Code   Generation   in   the   Category   box.   See   the   Use   Run-Time   Library   drop-down   box.  
   
  从程序可移植性考虑,如果两函数都可完成一种功能,选运行时库函数好,因为各个   C   编译器的生产商对标准C   Run-time   library提供了统一的支持.  
 
                            c程序  
                              |  
                              |  
                              |   
                              \/                              
                          c运行时库  
                              |  
                              |  
                              |  
                              \/  
                           OS   API
阅读(334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~