动态库编写:
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<动态库名> 要连接动态库 ld(dlfnc.h要求的动态库)
结果:生成 dusect.out 可执行文件
./dusect.out
输出:hello library
如果dlopen的第一个参数是绝对路径则直接打开
如果只是文件名则文件路径搜索的顺序:$LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib , /lib
(能做 != 能做好 所以学习规范)
1、 命名约定
每个动态库可由3个名字来命名分别为:
(1)realname
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