Linux下学习动态库的笔记2

 

Linux下学习动态库的笔记:

动态库(dynamic libraries),或叫共享库(shared libraries)是一些编译好的代码片断,当需要它的程序运行时.会由/lib/ld.so负责动态地加载它.使用它的好处有:节约磁盘和内存空间,因为同一段代码只有一个副本;节约编译时间只.需编译更改过的模块即可.
动态库的命名规则为:lib + 库名称 + .so + .version,如libstdc++.so.6
动态库都会有一个相应的.la文件,这是用来在编译过程中给编译器使用的.如果是程序中动态加载的话就不需要它了.

动态库在Windows下是DLL文件。

动态库有两种方法:隐式调用(动态链接)和显示调用(动态加载)

动态库的隐式调用(动态链接):
1.编写动态库函数代码:
//myAddLib.h

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


 

 

2.制作库文件:
#gcc -fpic myAddLib.c                   //创建.o文件
#gcc -shared -o libmyAddLib.so myAddLib.o //创建so
或者
#gcc -fpic -shared -o libmyAddLib.so myAddLib.c  //直接创建so

-fpic:产生位置无关代码
-shared:生成共享库
注意:库文件名一定要以lib打头, .so结尾

执行完后会生成libmyAddLib.so动态函数库

 

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

/*************************************************************    
    FileName : testAddLib.c
    FileFunc : 测试动态库文件  
    Version  : V0.1    
    Author   : Sunrier    
    Date     : 2012-05-02
    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 -o testAddLib testAddLib.c -L. -lmyAddLib
-L指定动态函数库的位置供查找,注意L后面还有'.',表示动态函数库在本目录下查找。
此时还不能立即./testAddLib,因为在动态函数库使用时,会查找/usr/lib或/lib目录下的动态函数库,而此时我们生成的
库不在里边。

                                                                                                                                                                                                                                                                                                                                
3)执行可执行文件
这个时候有好几种方法可以让他成功运行:
最直接最简单的方法就是把libmyAddLib.so放到/usr/lib 或/lib中去。
还有一种方法环境变量,假设libmyAddLib.so在/home/Sunrier/lib
export LD_LIBRARY_PATH=/home/Sunrier/lib:$LD_LIBRARY_PATH
另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib
或/lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。
[root@localhost lib]# cp libmyAddLib.so /lib/
[root@localhost lib]# ./testAddLib
iArg1= 10 , iAgr2= 20
iSum=30
Hello Sunrier!
[root@localhost lib]#

 


 


 

你可能感兴趣的:(linux,Date,测试,Path,library,编译器)