linux库文件的制作
一、为什么要使用库文件 我们在实际编程工作中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同, 实现代码也相同,也是我们所说的重复代码.比如,很多项目里都有一个用户验证的功能. 代码段如下: //UserLogin.h文件,提供函数声明 int IsValidUser(char* username, int namelen); //UserLogin.c文件,实现对用户信息的验证 int IsValidUser(char* username, int namelen) { int IsValid = 0; /*下面是具体的处理代码,略去*/ return IsValid } 如果每个项目都保存着这两个UserLogin.h和UserLogin.c文件,会有以下几个 弊端: 1、每个项目里都有重复的模块,造成代码重复. 2、代码的重用性不好,一旦IsValidUser的代码发生了变化,为了保持设计的一致性, 我们还要手工修改其他项目里的UserLogin.c文件,既费时又费力,还容易出错. 库文件就是对公共代码的一种组织形式. 为了解决上面两个弊端,就提出了用库文件存放公共代码的解决方案,其要点就是 把公共的(也就是可以被多次复用的)目标代码从项目中分离出来,统一存放到库文件中, 项目要用到这些代码的时候,在编译或者运行的时候从库文件中取得目标代码即可.库文件 又分两种:静态库和动态库. 二、静态库与动态库 如果程序是在编译时加载库文件的,就是使用了静态库.如果是在运行时加载目标代码, 就成为动态库.换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段, 程序的体积会膨胀.如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找 库文件和函数体,程序的体积基本变化不大. 静态库的原则是“以空间换时间”,增加程序体积,减少运行时间; 动态库则是“以时间换空间”,增加了运行时间,但减少了程序本身的体积. 下面我们就以实际例子来看看如何使用这两种库. 三、静态库的编写和使用 1、概述 静态库文件的扩展名一般为.a,其编写步骤很简单. ⑴编写函数代码 ⑵编译生成各目标文件 ⑶用ar文件对目标文件归档,生成静态库文件. 注意归档文件名以lib打头. 使用要点: ⑴在gcc 的-I参数后加上静态库头文件的路径. ⑵在gcc 的-L参数后加上库文件所在目录 ⑶在gcc 的-l参数后加上库文件名,但是要去掉lib和.a扩展名. 比如库文件名是libtest.a 那么参数就是 -l test 2、编写最简单的静态库文件 编写如下两个文件,注意放在同一目录中 myalib.h //静态库头文件 myalib.c //静态库实现文件 //myalib.h 文件的内容 void test(); //myalib.c 文件的内容 #inlcude void test() { printf("testn"); } 3、制作库文件 ⑴生成目标文件 gcc -c myalib.c 执行完后会生成一个myalib.o文件 ⑵用ar命令归档,格式为ar -rc <生成的档案文件名> <.o文件名列表> 再次提醒,归档文件名一定要以lib打头, .a结尾. ar -rc libtest.a myalib.o 执行完后会生成一个libtest.a文件 4、使用库文件 ⑴编写一个测试程序main.c,内容为 //main.c 测试静态库调用的程序 #include "myalib.h" //要把函数的头文件包含进来,否则编译时会报错 int main(int argc,char* argv[]) { test(); return 0; } ⑵编译目标文件,注意要把静态库头文件的路径加到-I参数里面 gcc -I /root/exercise -o main.o -c main.c 现在生成了一个main.o文件 ⑶生成可执行文件,注意要把静态库 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |