静态链接,静态链接库,CRT

    这里只讨论静态链接库。

    库是编译好的目标代码的集合。程序员可以在库中按需取用,将自己需要的代码链接入自己的程序。linux下,编译好的.o目标文件用ar(archive)打包,形成.a(archive)文件。类似的,Windows下有.lib文件。一个典型的.a文件是/usr/lib/i386-linux-gnu/libc.a。该文件以每个函数一个.o文件的形式给出了很多实现,比如bind(),printf(),strcpy()等等。类似的,在VC6.0中,菜单Project/Project Settings/link下可以看到该工程链接时包含的.lib文件,比如kernel32.lib,user32.lib,gdi32.lib。我们也可以自己编写.lib文件,将.lib文件和.h文件添加入合适的目录后,写程序时就可以引用其中的代码。GCC和VC都提供了相应的功能。总之,就如同静态链接库的后缀名一样,静态链接库就是一个个编译好的代码的library。

    在C语言发展史上,曾经出现过多种基础代码库。由于这些基础代码的开发者不同,因而无法方便的移植。大学A自己开发了libA,大学B自己开发了libB。结果却发现libA和libB好多函数从名字到调用格式都不相同。这就意味着大学A基于libA的代码难以被大学B重用。即使大学A将libA交给大学B,大学B也会遇到诸多麻烦,比如libA和libB中的同名函数会导致链接失败。1983年,美国国标标准协会(American National Standards Institute, ANSI)制定了第一个C语言标准ANSI C。ANSI C包含两部分内容,一是C语言的规则,譬如语法规则(如++的定义),语义规则(如int类型的定义),关键字(如const的定义)等等;二是库——一个代码工具集。ANSI并不规定库函数的实现细节,只规定库函数的调用格式,头文件名称和相关的宏定义。后来,该标准被逐渐扩充、修改。最终,C语言规则部分形成了现在的C语言,而库部分形成了所谓的ANSI C标准库。从功能上来看,ANSI C标准库包含了标准输入输出,文件操作,字符与字符串操作,数学处理,格式转换,时间/日期和其它常用代码。可以说,ANSI C标准库是一套标准化的工具,它之于基于ANSI C的程序,就如同标准化后的汽车零部件之于组装完毕的汽车。VC和GCC都是支持ANSI C的编译器,这意味着:1. 它们可以顺利编译依照ANSI C所定义的语法、语义等写出的代码;2. 除编译器外,它们的发布者还需发布ANSI C标准库的实现。

    事实上,除了ANSI C标准库(除非编译器不支持ANSI C)和特殊库(如微软的MFC),编译器还要提供额外的支撑性的二进制代码。这些代码将以静态链接的方式和开发者自己的代码组装成最终的可执行文件。这些支撑性的代码包括入口、出口函数,内存管理代码,I/O代码,语言实现,调试代码等等。这些代码的典型功能包括:将命令行参数给到main函数,堆空间的申请和初始化,main函数结束后进行系统调用返回,以及某些特殊功能,比如C++全局对象构造函数、析构函数的执行。与其说main函数是程序入口,不如说main函数嵌入了上述支撑性代码之中。典型的,ANSI C标准库加上这些支撑性代码,统称C运行库(C RunTime Library,CRT,为什么不是CRL呢)。下图展示了CRT,OS和APP的关系。
常见的CRT有两个,一是linux下由GNU发布的GNU C Library,简称glibc;二是Windows下由微软伴随Visual C++发布的MSVCRT。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值