动态库



LINXU动态库应用

动态库编写:

ct.c 文件

#include<stdio.h>

void show()

{

       printf(“hello library/n”);

}

 

gcc –fPIC –shared –o libct.so ct.c

-fPIC   -à  生成的文件为可重定位的)

 (-shared  -à  生成动态链接库        )

结果:生成libct.so 动态库

 

 

调用动态库

usect.c

#include<stdio.h>

int main ()

{

       show();

}

 

gcc –o usect usect.c ./libct.so

结果:生成 usect 可执行文件

./usect   

输出:hello library

 

 

动态库动态调用

dusect.c

#include<stdio.h>

#include<dlfnc.h>

int main ()

{

       void *dp = NULL;

void (*fp)();

 

dp = dlopen(“./libct.so”, RTLD_LAZY);

if(dp == NULL)

{

       printf(“load library error !/n”);

       exit(1);

}

 

fp = dlsym(dp,”show”);

fp();

 

dlclose(dp);

return 0;

}

 

gcc –o dusect.out dusect.c –ldl

-ldl  ---- -l<动态库名>  要连接动态库 lddlfnc.h要求的动态库)

结果:生成 dusect.out 可执行文件

./dusect.out

输出:hello library

 

如果dlopen的第一个参数是绝对路径则直接打开

如果只是文件名则文件路径搜索的顺序:$LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib , /lib

 

 

(能做 =  能做好    所以学习规范)

 

1、  命名约定

每个动态库可由3个名字来命名分别为:

1realname

lib + name + .so +.major_name.minor_name.patch_name

        ()   libc.so.5.0.0

 

(2)  soname

        lib + name + .so +Library_name.major_name

  例: libc.so.5

(3)     linker name

        lib + name + .so

       例: libc.so

linkername soname 都是符号链接文件

 

三者关系

  linkername --à soname --àrealname

   即:linkername soname 的符号链接  soname 又是 realname 的符号链接

 

我们创建的动态库首先要以realname来命名然后建立相应符号链接

编译器以linkername来请求指定的链接库

(为什么这样做?这样如果动态库有版本更新时只需要替换原来的动态库并重新设置soname指向的文件,应用程序不受到任何影响。因为应用程序编译时是用linkername 指定链接的动态库的。)

 

 

(重新创建文章开头的动态库)

动态库编写:

ct.c 文件

#include<stdio.h>

void show()

{

       printf(“hello library/n”);

}

 

gcc –fPIC –shared –o libct.so.1.0.0 ct.c

-fPIC   -à  生成的文件为可重定位的)

 (-shared  -à  生成动态链接库        )

结果:生成libct.so.1.0.0 动态库

 

创建soname(符号链接)

ln –s libct.so.1.0.0  libct.so.1

创建linkername(符号链接)

ln –s libct.so.1  libct.so

 

usect.c

#include<stdio.h>

int main ()

{

       show();

}

 

Gcc –o usect.out  usect.c  -L. -lct

结果:生成 usect.out 可执行文件

 

 

ldd usect.out

输出:

。。。。。。

libct.so   => ……..

libc.so.6  =>……..

。。。。。。

ldd命令列出来程序请求的动态库(我们的usect.out 请求了libct.so动态库)

 

./usect.out

输出:(不能运行,找不到动态库!!!!!)

 

程序怎样寻找动态库:程序在以下目录里依次查询你要的动态库。

$LD_LIBRARY_PATH, (环境变量)

/etc/ld.so.conf,

 /usr/lib ,

 /lib

每次都查找这么多目录影响性能,所以引入了/etc/ld.so.cache 文件来缓存查找路径。

(系统每次启动时都执行ldconfig 的程序,该程序是把/etc/ld.so.conf文件里的路径和, $LD_LIBRARY_PATH /usr/lib , /lib这些路径信息加入到/etc/ld.so.cache里。这样每次查找动态库时只需要查找/etc/ld.so.cache文件。)为了让系统能够自动找到我的动态库,只需要把我们的动态库加入到/usr/lib /lib 目录里 或者把我们动态库所在的路径信息加入到/etc/ld.so.conf 文件中 然后 启动ldconfig 命令来刷新 /etc/ld.so.cache 缓存信息。

 

我的动态库信息:

ls  /hzp

libct.so.1.0.0  usect.out  (我的文件都在 /hzp 目录下)

 

现在把 /hzp 路径信息加入  /etc/ld.so.conf  

启动 ldconfig 

./usect.out

输出: hello  library !

 

 

 

开源软件应遵守GNU 标准:当分发源代码的时候,库默认安装在 /usr/local/lib,命令安装

/usr/local/bin。该标准还定义了如何重写这些默认标准以及如何调用安装程序。

Filesystem Hierarchy Standard(FHS) 规定:多数库应安装在 /usr/lib,启动时需要的库安装在

/lib,非系统库应安装在 /usr/local/lib

GNU 标准是针对开发人员的,FHS 是针对发行者的。

来自:http://blog.csdn.net/huzhiping003/article/details/2914650

你可能感兴趣的:(动态库)