lib文件 与dll文件

     简单说就是静态库和动态链接库,这两个概念是随着程序规模不断增大渐渐出现的.从C语言开始说起。 C语言本身只有32个关键字,9种控制语句,34种运算符,的确是一门简单的语言。这样一门简单的语言在实用的时候并非一件好事,比如C语言没有输入输出语句,程序员在输入输出时不得不借助于函数。

   库函数是什么?简单的说,就是把常用的函数写好放到库里便于以后直接使用,这个库就称为函数库,函数被称为库函数。

    library)的本质是共享。我们从library这个单词的本义就可以看出,正如图书馆是为了实现图书资料的共享,函数库是为

实现函数的共享。共享是函数库的根本目的也是最大意义,它体现在这样两个方面:

1.资源可以被他人使用。2.资源可以被重复使用。


    但是被调用的时候我们并不想别人看到实现的代码,于是就有了新的方法。

    虽然用图书馆类比函数库可以说明函数库的意义,但是函数库究竟是什么?它和我们自己写的函数有什么不同?它存在于我

们计算机的什么位置?是什么样的文件?根据我的理解,函数库在我们的计算机中对应着这样三种文件:

1.头文件(Header Files),后缀为 .h。这个文件就是实实在在的源代码,只要符合C语法的句子都可以写进去,但是为了发挥出它真正的作用,里面只写了库函数和变量的声明,后文会提到原因。

2.静态库文件(Static Library ),在Windows下后缀为 .lib,在Linux下后缀为 .a。这个文件中真正包含了某些库函数的实现。但是这个文件不是C语言的代码,而是二进制码。

3.动态链接库文件(Dynamic Linked Library),在Windows下后缀为 .dll,在Linux下后缀为 .so。这个文件也包含了某些库函数的实现,同样是二进制码。

    结合C语言程序的完整编译和运行过程,介绍这三种文件怎样被用到:

1.预处理阶段,预处理器从头至尾扫描文件,寻找#开头的预处理指令,进行文本替换和插入。这时,我们#include的头文件将被完全插入到include所在位置,就好像替你在写include的位置写了一遍相应的头文件里的代码。

2.编译阶段,编译器对上阶段预处理好的程序进行分析和合成,生成目标模块。这个目标模块其实就是被翻译好的二进制的机器代码,又叫目标文件,后缀是 .obj,在win7下是.o文件。需要说明的是静态库文件 .lib本质是一种二进制代码。dll同样。

3.链接阶段,连接器将将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件(executable file)。这个可执行文件就是真正的可以被加载到内存中,然后能被底层硬件所执行的文件。比如Windows下的.exe文件。

同样说明两点:(1)上个阶段编译器在函数调用的地方生成了引用符号,在链接阶段必须去找到引用符号的实现,如果函数定义在C文件中,链接器就会去找到那个对应的目标文件.o,如果是静态库函数,则在 .a中,对于这两者链接器都会将它们加入到 .exe文件中。如果找不到对应的函数定义,会报错,如果找到多个而导致无法区分,也会报错。(2)对于标准库文件只需要引用头文件,链接的时候编译器自动查找对应的.a。而对于自己的库,不但在要源码中包含头文件,在链接时还要指明库文件。

4.运行阶段,程序真正运行过程中,还可以调用动态链接库.dll,这个dll文件,我们可以认为它是exe文件的半成品,它没有main函数,因此不能被直接执行,但它可以被exe动态地引用和卸载,它和静态库的最大不同在于,静态库.a中内容最后都要被加入到exe中,而dll是独立于exe的,它只是被调用,然后又被释放,dll中的内容并没有被加入exe。这样带来的好处是,内存中只有DLL的一份复制品,节约了内存资源。Dll的调用分为静态调用和动态调用,静态调用需要相应的导入库.a文件来提供DLL 导出函数的符号名及序号,动态调用则需要用LoadLibrary和GetProcAddress语句去寻找函数的入口。

回过头来看这三种文件,.h文件给出了函数的声明,在预处理阶段被加入程序代码中,至于函数的定义,如果放在.a文件中,则

在链接阶段就把.a文件加入到exe文件中,如果放在.dll文件中,则在程序运行阶段才会由应用程序去调用dll中的函数。用这样的

方式来实现库函数,带来的意义是:

1.函数的实现过程被隐藏为二进制码的形式,而不是源码,既保护了函数库编写者的版权,又提升了可移植性

2.函数的声明以头文件形式被提供给用户,用户通过头文件中的声明了解库函数的功能和使用方法。

                那么我们如何自己写出一个函数库呢,其实也很简单,在集成开发环境下,我们新建一个工程,平时我们总是新建控制台工程,其实我们还可以新建静态库工程或是动态链接库工程,这样编译出来的就是.a.dll

 

下面给出C89标准中标准库的15个头文件:

 

<assert.h> 验证程序断言,用于诊断

<ctype.h> 字符类型和字符类测试

<errno.h> 说明出错码

<float.h> 浮点运算有关的常量

<limits.h> 实现和定义时的限制

<locale.h> 声明了C语言本地化函数 

<math.h> 说明了数学函数和宏

<setjmp.h> 非局部跳转

<signal.h> 信号处理部分, 规定了了程序执行时如何处理不同的信号 。 

<stdarg.h> 可变参数表,提供了依次处理含有未知数目和类型的函数变元表的机制

<stddef.h> 标准定义,定义了一些标准宏以及类型 

<stdio.h> 标准I/O库,定义了用于输入和输出的函数、类型和宏。

<stdlib.h> 实用程序库函数

<string.h> 字符串操作处理函数

<time.h>  日期和时间的类型和函数

 

95年对C89的修订版新增了三个

 

<iso646.h> 替代关系操作符宏 

<wchar.h> 宽字符支持

<wctype.h> 宽字符分类和映射支持

 

C99版本又新增了六个

 

<complex.h> 支持复数算术运算

<fenv.h> 浮点环境

<inttypes.h> 整型格式转换

<stdbool.h> 布尔类型和值

<stdint.h> 整型

<tgmath.h> 通用类型数学宏

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值