1 / 13
文档名称:

lib库使用学习笔记.docx

格式:docx   大小:39KB   页数:13页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

lib库使用学习笔记.docx

上传人:2623466021 2019/3/11 文件大小:39 KB

下载得到文件列表

lib库使用学习笔记.docx

相关文档

文档介绍

文档介绍:Lib库使用学****笔记Chapter 1. 为什么使用库文件我们在实际编程工作中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同,实现代码也相同,也是我们所说的重复代码。比如,很多项目里都有一个用户验证的功能。代码段如下://,提供函数声明intIsValidUser(char*username,intnamelen);//,实现对用户信息的验证intIsValidUser(char*username,intnamelen){intIsValid=0;/*下面是具体的处理代码,略去*/returnIsValid;},会有以下几个弊端:每个项目里都有重复的模块,造成代码重复。代码的重用性不好,一旦IsValidUser的代码发生了变化,为了保持设计的一致性,,既费时又费力,还容易出错。库文件就是对公共代码的一种组织形式。为了解决上面两个弊端,就提出了用库文件存放公共代码的解决方案,其要点就是把公共的(也就是可以被多次复用的)目标代码从项目中分离出来,统一存放到库文件中,项目要用到这些代码的时候,在编译或者运行的时候从库文件中取得目标代码即可。库文件又分两种:静态库和动态库。Chapter 2. 静态库和动态库简单的说,如果程序是在编译时加载库文件的,就是使用了静态库,静态库的文件名格式是"lib*.a"。如果是在运行时加载目标代码,就成为动态库,动态库的文件名格式是"lib*.so.*"。换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀。如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大。静态库的原则是“以空间换时间”,增加程序体积,减少运行时间;动态库则是“以时间换空间”,增加了运行时间,但减少了程序本身的体积。在附录的PIC部分,也会做一些说明。从文件的格式角度讲,静态库的本质是一种档案文件(.o文件的集合),其中包含了一个内容索引(也可以不包含,但没有索引的静态库不能用来链接,在附录的ar ;而动态库是ELF格式的文件,可以被用来加载和执行,而静态库不可以。还有一种库文件,共享库。看到网上有些资料说,动态库就是共享库的一种变种,由于没有使用到,没有详细研究。有时候,会在目录中看到以".la"或".lo"结尾的文件,这些是GNU的工具libtool生成和使用的文件,用来说明实际库文件的使用信息和以来关系,详细的内容会在以后automakeautoconfandlibtool的文档中介绍。Chapter 3. . 制作最简单的静态库文件编写如下两个文件,放在同一目录中://静态库头文件voidtest();//静态库实现文件#include<>voidtest(){printf("helloworld./n");}使用下边的命令生成静态库:gcc-,注意一定要以lib*.a这样的格式命名,否则链接器ld不能识别。使用命令""看看它的格式,是一个档案文件。我们可以使用 nm查看它的内部构成:[******@Bensonlibtest]#:,在使用的时候,gcc会根据需要将函数名得到模块,然后从静态库中提取出对应的".o"文件的内容,然后用来链接,就是使用单独的".o"文件一样。. ,内容为:#include""intmain(void){test();return0;},所以在编译时,需通过"-L-l"参数指定链接这个库:gcc-I./--L./-lmy通过-I和-的头文件和库文件搜索路径为当前目录,也可以根据需要指定为其他目录。生成执行文件main后,执行命令"filemain",可以看到:[******@Bensonlibtest]#filemainmain:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),forGNU/,staticllylinked(usessharedlibs),notstripped运行,看到结果,成功。Chapter 4. 动态库的生成和使用 .