Linux下学习静态库的笔记1

 


Linux库文件简介

 

Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

 

 

为什么要使用库文件?
笔者由于经验水平有限,望各位有所补充,大体我概括为下面两个:
1.几个项目里有一些函数模块的功能相同,实现代码也相同,造成代码重复
2.不想把你实现的代码功能让别人看到你所实现的细节

库文件分两种:静态库和动态库。

 

静态库与动态库:
如果程序是在编译时加载库文件的,就是使用了静态库.如果是在运行时加载目标代码,就成为动态库.换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀.如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大.静态库的原则是"以空间换时间",增加程序体积,减少运行时间;动态库则是"以时间换空间",增加了运行时间,但减少了程序本身的体积.

 

百度来自网络上的解释(偶认为解释的挺好):

静态函数库:
  这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。

动态函数库:
  这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减小应用程序的体积。


下面主要来介绍下学习静态库的笔记

静态命名规则为:lib + 库名称 + .a

Linux下编写最简单的静态库文件:
一.概述
静态库文件的扩展名一般为.a,其编写步骤如下
(1)编写函数代码
(2)编译生成各目标文件
(3)用ar文件对目标文件归档,生成静态库文件。
注意归档文件名一定要以lib打头, .a结尾

二.实验练习
1.编写静态库函数代码:
//myAddLib.h

/*************************************************************    
    FileName : myAddLib.h
    FileFunc : 定义头文件   
    Version  : V0.1    
    Author   : Sunrier    
    Date     : 2012-04-28
    Descp    : Linux下实现静态库    
*************************************************************/
#ifndef   _MYADDLIB_H_    
#define   _MYADDLIB_H_ 

#ifdef __cplusplus
extern "C" {
#endif

int add(int ,int );

#ifdef __cplusplus
}
#endif

#endif 


 

 

 

//myAddLib.c

/*************************************************************    
    FileName : myAddLib.c
    FileFunc : 定义静态库实现文件  
    Version  : V0.1    
    Author   : Sunrier    
    Date     : 2012-04-28
    Descp    : Linux下实现静态库   
*************************************************************/
#include <stdio.h>
int add(int iArg1,int iArg2)
{
        printf("iArg1= %d , iAgr2= %d \n",iArg1,iArg2);
        return (iArg1+iArg2);
}



 

2.制作库文件:
1)生成目标文件
  gcc -c myAddLib.c
  或者gcc -o myAddLib.o -c myAddLib.c
  执行完后会生成一个myAddLib.o文件,因为不指定-o的参数下,默认生成目标文件xxxx.o(xxxx跟原文件.c的前缀相同)

2)用ar命令归档,格式为ar -rc <生成的档案文件名> <.o文件名列表>
  注意:归档文件名一定要以lib打头, .a结尾
  ar -rc libmyAddLib.a myAddLib.o
  执行完后会生成一个libmyAddLib.a 文件

   -c create的意思
   -r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块.如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块.默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。

3.使用库文件:
1)编写测试静态库文件程序
//testAddLib.c

/*************************************************************    
    FileName : testAddLib.c
    FileFunc : 测试静态库文件  
    Version  : V0.1    
    Author   : Sunrier    
    Date     : 2012-04-28
    Descp    : Linux下实现静态库  
*************************************************************/
#include <stdio.h>
#include "myAddLib.h"

int main(int argc,char *argv[])
{
        int iNumber1,iNumber2,iSum = 0;
        iNumber1 = 10;
        iNumber2 = 20;
        iSum = add(iNumber1,iNumber2);
        printf("iSum=%d\n".iSum);
        printf("Hello Sunrier!\n");
        return 0;
}


 

2)编译目标文件
  gcc -I/mnt/hgfs/Sunrier/Lib -o testAddLib.o -c testAddLib.c
  注意要把静态库头文件的路径加到-I参数里面,
  如gcc -I/XXXX/XXXX -o testAddLib.o -c testAddLib.c其中-I/XXXX/XXXX表示连接的静态库头文件路径 ,执行完后会生成一个testAddLib.o目标文件

3)生成可执行文件,把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面,-lxxxx要放在实现目标文件的后面,以表示目标文件的实现在连接的库文件里。

gcc -L/mnt/hgfs/Sunrier/Lib -o testAddLib testAddLib.o -lmyAddLib

注意要把静态库目标实现文件的路径加到-L参数里面,如gcc -o testAddLib -L/xxxx/xxxx testAddLib.o -lmyAddLib其中-L/xxxx/xxxx表示连接的静态库实现目标文件的路径 。执行完后会生成一个testAddLib可执行文件

-l是用来指定静态连接库,-l是一种简便写法,也可直接写libmyAddLib.a

 gcc -L/mnt/hgfs/Sunrier/Lib -o testAddLib  testAddLib.o  libmyAddLib.a

2)和3)合起来 :gcc -o  testAddLib  testAddLib.c  -L.  -lmyAddLib

-L指定静态函数库的位置供查找,如果在本目录下,则-L后面还有'.',即-L.表示静态函数库在本目录下查找。

 可见-L来告诉编译器到哪个位置去libmyAddLib.a这个链接库。-L.就是到当前目录寻找。默认情况下,gcc不会到当前目录下去找的。所以要指定路径。

 

4)执行可执行文件,测试是否成功
  [root@localhost Lib]# ./testAddLib
  iArg1= 10 , iAgr2= 20
  iSum=30
  Hello Sunrier!
  [root@localhost Lib]#
 说明执行成功。

5)总结静态库使用要点:
 (1)在gcc 的-I参数后加上静态库头文件的路径
 (2)在gcc 的-L参数后加上库文件所在目录
 (3)在gcc 的-l参数后加上库文件名,但是要去掉lib和.a扩展名
    比如库文件名是libmyAddLib.a ,那么参数就是-lmyAddLib

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值