lib文件作用.docx

上传人:牧羊曲112 文档编号:3061539 上传时间:2023-03-10 格式:DOCX 页数:6 大小:39.91KB
返回 下载 相关 举报
lib文件作用.docx_第1页
第1页 / 共6页
lib文件作用.docx_第2页
第2页 / 共6页
lib文件作用.docx_第3页
第3页 / 共6页
lib文件作用.docx_第4页
第4页 / 共6页
lib文件作用.docx_第5页
第5页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《lib文件作用.docx》由会员分享,可在线阅读,更多相关《lib文件作用.docx(6页珍藏版)》请在三一办公上搜索。

1、lib文件作用lib库的作用是什么 LIB有两种,一种是静态库,比如C-Runtime库,这种LIB中有函数的实现代码,一般用在静态连编上,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了.一种LIB是和DLL配合使用的,里面没有代码,代码在DLL中,这种LIB是用在静态调用DLL上的,所以起的作用也是链接中用,链接完成了,LIB也没用了.至于动态调用DLL的话,根本用不上LIB文件. 目标模块文件生成之后,就用不着LIB文件了. 如何打开LIB文件 用编程语言,打开lib文件的办法有三个: 1、在object/library modules使

2、用全路径名; 2、把*.lib放在VC的Lib目录中 3、修改project setting的Link-Input中的Addtional library path,加入你的目录。 VC中加载LIB文件的方法 1.LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中Add Files to Project菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。 2.设置工程的 Project Settings来加载DLL的LIB文件 打开工程的 Project Settings菜单,选中Link,然后在Object/library mod

3、ules下的文本框中输入DLL的LIB文件。 3.通过程序代码的方式 加入预编译指令#pragma comment (lib,*.lib),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。 当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。 Lib文件中的节 Lib格式只有四种类型的节,即First Sec,Second Sec,Longna

4、me Sec和Obj Sec;其中Second Sec与Longname Sec是可选节,很多Lib文件中都没有。而开头的Singature只是一个标识,它相当于COFF目标文件中的魔法数字。它是一个长度为8的字符串,值为“!n”。 First Sec,顾名思义,就是第一个节。它包含了库中所有的符号名以及这些符号所在的目标文件在库中的位置。 Second Sec就是第二节。它的内容和First Sec是相同的。不同的是,Second Sec是一个有序表,通过它来查找库中的符号比通过First Sec来查找要快很多。 Longname Sec是长名称节。这一节是一个字符串表。它包含了所有长目标文

5、件名。如果后面的Obj Sec中没有给出相应的目标文件名,我们就要到这一节中来查找。 Obj Sec就是目标文件节。这些节中存储着不同的目标文件的原始数据。 在库文件中,每一节都有两个部分。一个部分是头,另一个部分才是该节的数据;数据紧跟在头的后面。头描述了该节数据的类型、长度等信息。这些头的格式都是相同的。其结构用C语言描述如下: typedef struct char Name16; / 名称 char Time12; / 时间 char UserID6; / 用户ID char GroupID6; / 组ID char Mode8; / 模式 char Size10; / 长度 char

6、 EndOfHeader2;/ 结束符 SectionHeader; 可以看到,头中的数据全都是字符串。用字符串的好处是可以提高格式的兼容性,因为在不同的机器上,数据的排列方式是不同的。有的机器是以Little-Endian方式工作,还有的是以Big-Endian方式工作,它们互不兼容。用字符串就不会有这种问题。但它也有不方便的地方,就是必须把字符串转换成数值,多了一个步骤。 在这个结构中,最常用的Name、Size以及EndOfHeader三个成员。Name就是节的名称啦!Size也很好理解,就是该节数据的长度。现在要注意的就是这个EndOfHeader成员了!这个成员标志着头的结束,其内容

7、为“n”。怎么样?有点奇怪吧?为什么要有这个结束符?每一节的头长度一定,每节中的数据长度也知道。按顺序向下读不行吗?答案是:不行!因为每一节之间存在间隙!通常是一个字节或零个字节。如果是零个字节倒好,按顺序向下读是OK的。可是如果不为零的话,这样读就要错位了。要知道错位没有,只好用一个结束符来定位了。如果在读头的时候发现结束符不对,那就要一个字节一个字节地向下查找,直到找到结束符,才能算是对齐了。切记!切记! 当然,通过First Sec或Second Sec中给出的偏移来读数据就不存在这个问题。不会发生错位,放心读吧! 现在让我们来看看每一节中的数据是什么样子。 First Sec 第一节,

8、通常就是Lib中的每一个小节。它的名称是“/”。其数据部分的结构如下: typedef struct unsigned long SymbolNum; / 库中符号的数量 unsigned long SymbolOffsetn; / 符号所在目标节的偏移 char StrTablem; / 符号名称字符串表 FirstSec; 第一个成员SymbolNum是符号的数量。注意!它是以Big-Endian方式储存的。 第二个成员SymbolOffset是一个数组,它的长度n就是符号的数量,也就是SymbolNum。这个数组储存了每一个符号所在的目标节的偏移。我们可以方便地通过它来查找符号所在的目标

9、文件。注意!它也是以Big-Endian格式储存的。 第三个成员StrTable是一个字符串表,它的长度m就是SectionHeader.Size的值减去*4。其结构很简单,就是一堆以0结尾的字符串。在有的系统中,它还可能是以“/n”这两个字符结尾的字符串的集合。 很简单的一个结构,不过有两个成员的长度是不定的。怎么才能方便地从Lib中读出这些数据,留给大家自己想吧!下面我只给出一个进行Little-Endian与Big-Endian互转的函数。 inline void convert(void * p / 要转换的数据的指针 ,size_t size = 4 / 数据的长度,long为4,s

10、hort为2 ) char * buf=(char*)p; char temp; for ( size_t i=0;isize/2;i+ ) temp=bufi; bufi=bufsize-i-1; bufsize-i-1=temp; Second Sec 第二节 这一节与第一节很相似!它通常也就是Lib文件的第二个节。它的名字也是“/”。不过它的结构与第一节有些不同,如下: typedef struct unsigned long ObjNum; / Obj Sec的数量 unsigned long ObjOffsetx; / 每一个Obj Sec的偏移 unsigned long Symb

11、olNum; / 库中符号的数量 unsigned short SymbolIdxn; / 符号在ObjOffset表中的索引 char StrTablem; / 符号名称字符串表 SecondSec; 第一个成员ObjNum是库中Obj Sec的数量。 第二个成员ObjOffset是一个偏移表,它记录了库中所有Obj Sec的偏移。这个表的记录数x就是ObjNum。 第三个成员SymbolNum与First Sec中的SymbolNum意义相同。 第四个成员SymbolIdx变成了一个索引,它记录了相应名称字符串在ObjOffset这个表中的位置,我们要通过两次索引才能找到我们所要符号的Ob

12、j Sec位置。它的项目数n为SymbolNum。但请注意,这个索引是unsigned short型,不再是unsigned long型。 第五个成员StrTable结构与First Sec中的一样。不过,它的长度m为SectionHeader.Size的值减去(ObjNum+1)*4+(SymbolNum+2)*2)。 值得注意的是,这里的所有数据都是Little-Endian格式的。千万不要弄错了!Longname Sec 这个小节就是一个字符串表,它的名称为“/”,其结构同FirstSec.StrTable。这里就不多说了。 Obj Sec 这一节中的数据就是COFF文件的原始数据,把它

13、读出来存成文件,就是一个COFF文件。它的格式请参考COFF格式一文。 要指出的是它的命名方式有些特殊。如果Obj文件的名称少于16个字符,它就会被保存在SectionHeader的Name成员中,以/字符结尾。如果无法保存在Name成员中,则Name成员的第一个字符就为/,之后再跟上这个名称在Longname Sec中的偏移。 例如: !n LongName Sec: This_Is_Long_Name00010 This_Is_Long_Name00020 Obj Sec1: Name16:“shortname/” Obj Sec2: Name16:“/0” / 这里使用了第一个长文件名This_Is_Long_Name0001 Obj Sec3: Name16:“/22” / 这里使用了第二个长文件名This_Is_Long_Name0002

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号